当前位置: 首页 > 知识库问答 >
问题:

AWS多部分上传SDK不起作用

龙霖
2023-03-14

我需要关于使用PHP5.3上传AWS多部分的帮助,我使用的是1.WAMP服务器。2.PHP 5.3 3.操作系统:Windows 8我正在尝试将一个大文件上传到My Amazon S3存储桶。

尝试了很多方法。我按照http://docs.aws.amazon.com/AmazonS3/latest/dev/LLuploadFilePHP.html的代码程序

我写了PHP代码,但我不知道我犯了什么错误。

我的代码:

<?php
        require_once './sdk/sdk.class.php';

    use \AmazonS3;

    $ufile = $_FILES['ufile'];
    $filepath = $ufile['tmp_name'];
    $bucket = '**My_bkt**';
    var_dump($ufile);
    print $keyname = \date("Y") . "/" . \date("F") . "/" . \date("d") . "/" . $ufile['name'] . "<BR />"; 


    $api_key = "***my_api_key***";
    $secret_key = "***my_secret_key***";


    // Define a megabyte.
    define('MB', 1048576);

    // Instantiate the class
    //$s3 = new AmazonS3();
    $s3 = new AmazonS3(array(
        'key' => $api_key,
        'secret' => $secret_key,
            ));

    // 1. Initiate a new multipart upload.
    /* @var $response type */
    $response = $s3->initiate_multipart_upload($bucket, $keyname);

    // Get the Upload ID.
    $upload_id = (string) $response->body->UploadId;

    // 2. Upload parts.
    // Get part list for a given input file and given part size.
    // Returns an associative array.
    $parts = $s3->get_multipart_counts(filesize($filepath), 3 * MB);

    foreach ($parts as $i => $part) {
        // Upload part and save response in an array.
        $responses[] = $s3->upload_part($bucket, $keyname, $upload_id, array(
            'fileUpload' => $filepath,
            'partNumber' => ($i + 1),
            'seekTo' => (integer) $part['seekTo'],
            'length' => (integer) $part['length'],
                )
        );
    }

    // 3. Complete multipart upload. We need all part numbers and ETag values.
    $parts = $s3->list_parts($bucket, $keyname, $upload_id);

    $response = $s3->complete_multipart_upload($bucket, $keyname, $upload_id, $parts);

    var_dump($response);

请帮帮我。

共有3个答案

柯建业
2023-03-14

我将My SDK更新到版本2,它运行良好。

狄元魁
2023-03-14

我已经更新了我的SDK并更改了我的代码,如下所示,

////////////////AWS Code Begin/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

$ufile = $_FILES['Filedata'];
$filename = $ufile['tmp_name'];
$filesize = $ufile['size'];

/*     * ************ Calculating Number of Parts ******************* */
$number_of_parts = 0;
$r = $filesize % PART; // Remainder
$q = floor($filesize / PART); // Quotient
if ($r != 0) {
    $number_of_parts = $q + 1;
} else {
    $number_of_parts = $q;
}
$bucket = 'isource123';
$keyname = date("Y") . "/" . date("F") . "/" . date("d") . "/" . $ufile['name'];

/////////////////////////////步骤2////////////////////////使用配置文件创建服务生成器

$aws = Aws::factory('./aws/Aws/Common/Resources/aws-config.php');

// Get the client from the builder by namespace
    $client = $aws->get('S3');
$uploader = \Aws\S3\Model\MultipartUpload\UploadBuilder::newInstance()
        ->setClient($client)
        ->setSource($filename)
        ->setBucket($bucket)
        ->setKey($keyname)
        ->setOption('Metadata', array('Foo' => 'Bar'))
        ->setOption('CacheControl', 'max-age=3600')
        ->setConcurrency($number_of_parts)
        ->build();

try {
    $uploader->upload();
    echo "Upload complete.\n";
} catch (MultipartUploadException $e) {
    $uploader->abort();
    echo "Upload failed.\n";
}
赫连开畅
2023-03-14

我知道你在这里使用的是旧的SDK 1,所以我的回答不直接适用于你发布的内容。也就是说,SDK 1. x不再更新,SDK 2. x是所有新工作都应该使用的(根据AWS SDK for PHP团队的说法)。

如果您确实更新了项目以使用 SDK 2,请查看 S3 客户端::上传()。它应该大大简化你在这里尝试做的事情。

 类似资料:
  • 我正在尝试使用node.jsaws-sdk将大文件上传到s3存储桶。 方法以分段上传方式完整上传文件。 我想使用新的V3 aws-sdk。在新版本中上传大文件的方法是什么?方法似乎没有这样做。 我见过一些方法,例如,但我似乎找不到使用它们的完整工作示例。 先谢谢你。

  • 我试图使用cloudfront作为endpoint进行多部分上传,我知道这是可能的(https://Github.com/aws/aws-sdk-js/issues/423),我也在aws-sdk-js的Github上开了一张罚单,我不知道我是否缺少了一些配置选项,或者其他什么,但我不能使用aws sdk多部分上传函数在cloudfront上传,我总是在PUT请求上得到503个。 我使用以下代码启

  • 我试图用python写的lambda (aws)完成多部分上传。下面是我正在使用的代码。大约有120个部件,总大小为30GB。下面的操作似乎没有在5分钟内完成,因此lambda关闭,上传似乎没有完成。S3提供异步多部分上传功能吗?我相信这将确保文件得到合并,不管lambda关闭。

  • 有没有人知道一个教程,或一个示例项目,我可以从中获得想法,使一个多部分的上传工作?是否需要使用TransferManager来执行此操作? 提前多谢!

  • 我想从Kinesis多部分上传到我的Amazon S3存储桶。由于Amazon S3是一个文件系统,对于每个条目,它都会在给定的bucket名称下创建一个文件。 我的亚马逊S3为AWS粘合作业提供信息,因为只要亚马逊S3的特定文件夹中有新文件,它就会触发Lambda函数。对于流数据,每秒将有多个文件。 如何在 Kinesis 端控制文件的大小,以便 Kinesis 仅在达到特定阈值后推送 Amaz

  • 我正在使用Spring Boot 1.2。我想上传一个原始二进制文件到控制器。文件大小可能很大,因此我不想将整个请求保存在内存中,而是流式传输文件,事实上,文件是在传输开始时生成的,因此客户端甚至不知道文件的大小。我在这里看到了一个如何使用多部分编码的文件上传进行类似操作的示例。然而,我不想要一个多部分编码的上传,只是一个原始的字节流。我似乎找不到在Spring处理这个用例的方法。