Php AmazonS3只接收TMP文件

Php 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

我目前正在为我的webapp开发一个文件上传模块,允许用户上传

每次我上传一个文件(png、jpg、pdf等),该文件都会作为TMP文件到达S3存储桶

我相信我做的是正确的,因为apache应该先将文件存储为tmp文件,然后再将其成功上载。但由于某些原因,这些文件不会转换回它们的实际文件类型。请提供帮助,代码如下:

Index.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.
?>```


选择要上载的图像:
上传表单.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、文件系统、数据库,无论在哪里,这两个原因仍然适用。