我已经构建了一个将文件直接上传到S3的ajax上传程序,它完美无缺地解决了它实际上是如何工作的问题。我已经对文档中显示的方式采取了不同的方法,而不是指定sourceFile,而是在元数据中指定文件名。没有发送文件位置。
我正在使用AWS SDK 2.4.3
$client = S3Client::factory(array(
'key' => AWS_KEY,
'secret' => AWS_SECRET
));
$extension = pathinfo($this->request->query['fileInfo']['name'], PATHINFO_EXTENSION);
$model = $client->createMultipartUpload(array(
'Bucket' => AWS_BUCKET_NAME,
'Key' => uniqid() . '.' . $extension, // Files don't share same name
'ContentType' => $this->request->query['fileInfo']['type'], // image/png
'Metadata' => $this->request->query['fileInfo']
));
$这 - >请求 - >查询['的fileInfo']
array(
'name' => "image.png",
'type' => "image/png",
'size' => 196292,
'lastModifiedDate' => Wed Aug 20 2014 15:02:29 GMT+1200 (NZST)
);
SignUploadPart
$command = $client->getCommand('UploadPart',
array(
'Bucket' => AWS_BUCKET_NAME,
'Key' => $this->request->query['sendBackData']['key'], // 53fd39a185f43.png
'UploadId' => $this->request->query['sendBackData']['uploadId'], // hSJuBm3dWCMM1b....
'PartNumber' => $this->request->query['partNumber'],
'ContentLength' => $this->request->query['contentLength']
));
$request = $command->prepare();
$client->dispatch('command.before_send', array('command' => $command));
$request->removeHeader('User-Agent');
$request->setHeader('x-amz-date', gmdate(DateFormat::RFC2822));
$client->dispatch('request.before_send', array('request' => $request));
在任何地方都没有引用临时文件路径,我已经尝试过挖掘SDK,但似乎找不到任何能够找到查找文件的方法。此外,由于这是通过AJAX发送的,因此它不会创建临时文件。
删除Metadata
ContentType
并在Key
中分配随机CreateMultipartUpload
仍会上传文件,最后会以Key中指定的名称结束...有两个其他开发人员看着它,两者都无法弄清楚它是如何工作的。