Php AmazonS3只接收TMP文件
我目前正在为我的webapp开发一个文件上传模块,允许用户上传 每次我上传一个文件(png、jpg、pdf等),该文件都会作为TMP文件到达S3存储桶 我相信我做的是正确的,因为apache应该先将文件存储为tmp文件,然后再将其成功上载。但由于某些原因,这些文件不会转换回它们的实际文件类型。请提供帮助,代码如下: Index.phpPhp AmazonS3只接收TMP文件,php,html,amazon-web-services,amazon-s3,amazon-lightsail,Php,Html,Amazon Web Services,Amazon S3,Amazon Lightsail,我目前正在为我的webapp开发一个文件上传模块,允许用户上传 每次我上传一个文件(png、jpg、pdf等),该文件都会作为TMP文件到达S3存储桶 我相信我做的是正确的,因为apache应该先将文件存储为tmp文件,然后再将其成功上载。但由于某些原因,这些文件不会转换回它们的实际文件类型。请提供帮助,代码如下: Index.php <html> <body> <form action="http://localhost:7777
<html>
<body>
<form action="http://localhost:7777/centresafe/s3test/upload-form.php" method="post" enctype="multipart/form-data">
Select image to upload:
<input type="file" name="fileToUpload" id="fileToUpload">
<input type="submit" value="Upload Image" name="submit">
</form>
</body>
</html>
require 'C:\xampp\htdocs\webapp/vendor/autoload.php';
use Aws\S3\S3Client;
use Aws\S3\Exception\S3Exception;
// AWS Info
$bucketName = 'webapp';
$IAM_KEY = 'MY_KEY';
$IAM_SECRET = 'MY_SECRET';
// Connect to AWS
try {
// You may need to change the region. It will say in the URL when the bucket is open
// and on creation.
$s3 = S3Client::factory(
array(
'credentials' => array(
'key' => $IAM_KEY,
'secret' => $IAM_SECRET
),
'version' => 'latest',
'region' => 'ap-southeast-2'
)
);
} catch (Exception $e) {
// We use a die, so if this fails. It stops here. Typically this is a REST call so this would
// return a json object.
die("Error: " . $e->getMessage());
}
// For this, I would generate a unqiue random string for the key name. But you can do whatever.
$keyName = 'test_example/' . basename($_FILES["fileToUpload"]['tmp_name']);
$pathInS3 = 'https://s3.ap-southeast-2.amazonaws.com/' . $bucketName . '/' . $keyName;
print_r($_FILES);
$file = $_FILES["fileToUpload"]['tmp_name'];
echo "<br>";
echo $file;
exit;
// Add it to S3
try {
// Uploaded:
$file = $_FILES["fileToUpload"]['tmp_name'];
$s3->putObject(
array(
'Bucket'=>$bucketName,
'Key' => $keyName,
'SourceFile' => $file,
'StorageClass' => 'REDUCED_REDUNDANCY'
)
);
} catch (S3Exception $e) {
die('Error:' . $e->getMessage());
} catch (Exception $e) {
die('Error:' . $e->getMessage());
}
echo 'Done';
// Now that you have it working, I recommend adding some checks on the files.
// Example: Max size, allowed file types, etc.
?>```
选择要上载的图像:
上传表单.php
<html>
<body>
<form action="http://localhost:7777/centresafe/s3test/upload-form.php" method="post" enctype="multipart/form-data">
Select image to upload:
<input type="file" name="fileToUpload" id="fileToUpload">
<input type="submit" value="Upload Image" name="submit">
</form>
</body>
</html>
require 'C:\xampp\htdocs\webapp/vendor/autoload.php';
use Aws\S3\S3Client;
use Aws\S3\Exception\S3Exception;
// AWS Info
$bucketName = 'webapp';
$IAM_KEY = 'MY_KEY';
$IAM_SECRET = 'MY_SECRET';
// Connect to AWS
try {
// You may need to change the region. It will say in the URL when the bucket is open
// and on creation.
$s3 = S3Client::factory(
array(
'credentials' => array(
'key' => $IAM_KEY,
'secret' => $IAM_SECRET
),
'version' => 'latest',
'region' => 'ap-southeast-2'
)
);
} catch (Exception $e) {
// We use a die, so if this fails. It stops here. Typically this is a REST call so this would
// return a json object.
die("Error: " . $e->getMessage());
}
// For this, I would generate a unqiue random string for the key name. But you can do whatever.
$keyName = 'test_example/' . basename($_FILES["fileToUpload"]['tmp_name']);
$pathInS3 = 'https://s3.ap-southeast-2.amazonaws.com/' . $bucketName . '/' . $keyName;
print_r($_FILES);
$file = $_FILES["fileToUpload"]['tmp_name'];
echo "<br>";
echo $file;
exit;
// Add it to S3
try {
// Uploaded:
$file = $_FILES["fileToUpload"]['tmp_name'];
$s3->putObject(
array(
'Bucket'=>$bucketName,
'Key' => $keyName,
'SourceFile' => $file,
'StorageClass' => 'REDUCED_REDUNDANCY'
)
);
} catch (S3Exception $e) {
die('Error:' . $e->getMessage());
} catch (Exception $e) {
die('Error:' . $e->getMessage());
}
echo 'Done';
// Now that you have it working, I recommend adding some checks on the files.
// Example: Max size, allowed file types, etc.
?>```
require'C:\xampp\htdocs\webapp/vendor/autoload.php';
使用Aws\S3\S3客户端;
使用Aws\S3\Exception\S3Exception;
//AWS信息
$bucketName='webapp';
$IAM_KEY='MY_KEY';
$IAM_SECRET='MY_SECRET';
//连接到AWS
试一试{
//您可能需要更改区域。当bucket打开时,它会在URL中显示
//关于创造。
$s3=s3客户端::工厂(
排列(
“凭据”=>数组(
“键”=>$IAM_键,
“秘密”=>$IAM_秘密
),
'版本'=>'最新',
'地区'=>'亚太地区东南-2'
)
);
}捕获(例外$e){
//我们使用一个die,所以如果失败,它将停止在这里。通常这是一个REST调用,因此
//返回一个json对象。
die(“错误:”..e->getMessage());
}
//为此,我将为密钥名生成一个unqiue随机字符串。但你可以做任何事。
$keyName='test_example/'。basename($_文件[“fileToUpload”]['tmp_名称]);
$pathInS3=https://s3.ap-southeast-2.amazonaws.com/' . $bucketName.“/”$关键词;
打印(美元文件);
$file=$\u文件[“fileToUpload”][“tmp\u名称”];
回声“
”;
echo$文件;
出口
//将其添加到S3
试一试{
//上载:
$file=$\u文件[“fileToUpload”][“tmp\u名称”];
$s3->putObject(
排列(
“Bucket”=>$bucketName,
“Key”=>$keyName,
'SourceFile'=>$file,
“StorageClass”=>“减少冗余”
)
);
}捕获(S3$e){
die('Error:'。$e->getMessage());
}捕获(例外$e){
die('Error:'。$e->getMessage());
}
回音“完成”;
//现在您可以使用它了,我建议对文件添加一些检查。
//示例:最大大小、允许的文件类型等。
?>```
这与S3无关,文件没有类型,它们有名称。当你说“它正在上载一个TMP文件”时,你看到的是它正在上载一个名称中带有“TMP”的文件。这并不奇怪,因为您有这样一行:
$keyName = 'test_example/' . basename($_FILES["fileToUpload"]['tmp_name']);
请注意,您正在使用的密钥名为“tmp_name”-它是PHP分配给上传文件的临时名称。如果要使用用户指定的名称,则需要查看“名称”-但要注意,与用户的所有输入一样,它应被视为“不可信”,因为有些人可以指定他们想要的任何名称,而与文件的实际内容无关。看
如果要根据文件中的实际内容命名文件,则需要检查其内容,例如使用。然后,您可以为该文件类型生成自己的具有预期“扩展名”的文件名,例如,
$randomString'。pdf'
如果是pdf文件。@AnonCoward我不知道你的意思。PHP选择随机名称的原因是您不能信任来自客户端的文件名或类型信息;给它起一个不同的名字是为了给它贴上正确的标签,以便下一个人下载。S3、文件系统、数据库,无论在哪里,这两个原因仍然适用。