Php Aws S3 CompleteMultipartUpload错误
致命错误:未捕获Aws\S3\Exception\InvalidRequestException:Aws错误代码:InvalidRequest,状态代码:400,Aws请求ID:B1A28EBE65521DF4,Aws错误类型:客户端,Aws错误消息:必须至少指定一个部件,用户代理:aws-sdk-php2/2.7.22 Guzzle/3.9.2 curl/7.40.0 PHP/5.6.6在第91行的C:\vhosts************.com\db*********\FileUploader\u v2\aws\Common\Exception\NamespaceExceptionFactory.PHP中抛出 每当我使用AWS S3运行我的多部分上传程序时,就会出现上述错误。我的程序应该在JS脚本中分割文件的一部分,然后使用XMLHTTPRequest将其发送到php脚本。那部分似乎工作得很好。但是,调用CompleteMultipartUpload时会出现问题。我从错误中得出的结论是我的零件太小或是空的 upload.htm:Php Aws S3 CompleteMultipartUpload错误,php,amazon-web-services,file-upload,amazon-s3,filesize,Php,Amazon Web Services,File Upload,Amazon S3,Filesize,致命错误:未捕获Aws\S3\Exception\InvalidRequestException:Aws错误代码:InvalidRequest,状态代码:400,Aws请求ID:B1A28EBE65521DF4,Aws错误类型:客户端,Aws错误消息:必须至少指定一个部件,用户代理:aws-sdk-php2/2.7.22 Guzzle/3.9.2 curl/7.40.0 PHP/5.6.6在第91行的C:\vhosts************.com\db*********\FileUpload
var命令;
var文件;
var ownerName;
var总大小;
var partSize=2*1024*1024;//常数
var-sendBackData;
var总大小;
var sureUploadSize=0,ProbableUploadSize=0;
var Numpart;
var partsLeft=[]代码>
function _(el){
return document.getElementById(el);
}
function calcTotalSize(file){
var size_total = 0;
for(var i = 0; i < file.length; i++){
size_total += file[i].size;
}
return size_total;
}
function uploadFile(){
file = _("file").files[0];
console.log(file);
ownerName = _("name").value;
totalSize = file.size;
command = 'CreateMultipartUpload';
var formdata = new FormData();
formdata.append("command", command);
formdata.append("filename", file.name);
formdata.append("name", ownerName);
var ajax = new XMLHttpRequest();
ajax.open("POST", "FileUploader.php", true);
ajax.send(formdata);
ajax.onreadystatechange = function() {
if (ajax.readyState === 4) {
sendBackData = JSON.parse(ajax.responseText);
numParts = Math.ceil(totalSize / partSize);
uploadPart(1);
}
};
}
function uploadPart(partNum){
console.log("Uploading part " + partNum);
console.log(sendBackData['uploadId']);
command = 'UploadPart';
if (partNum > numParts) {
completeMultipartUpload();
return;
}
var formdata = new FormData();
var start = (partNum - 1) * partSize;
var end = start + partSize;
if (end > totalSize)
end = totalSize;
var length = end - start;
var curBlobPart = file.slice(start, end);
//console.log(sendBackData['uploadId']);
formdata.append("file[]", curBlobPart);
formdata.append("command", command);
formdata.append("uploadId", sendBackData['uploadId']);
formdata.append("key", sendBackData['key']);
formdata.append("partNumber", partNum);
var ajax = new XMLHttpRequest();
ajax.open("POST", "FileUploader.php", true);
ajax.addEventListener("load", completeHandler, false);
ajax.addEventListener("error", errorHandler, false);
ajax.addEventListener("abort", abortHandler, false);
ajax.send(formdata);
ajax.onreadystatechange = function() {
if (ajax.readyState === 4) {
uploadPart(partNum + 1);
}
};
}
function completeMultipartUpload() {
command = 'CompleteMultipartUpload';
var formdata = new FormData();
formdata.append("command", command);
formdata.append("uploadId", sendBackData['uploadId']);
formdata.append("key", sendBackData['key']);
var ajax = new XMLHttpRequest();
ajax.open("POST", "FileUploader.php", true);
ajax.addEventListener("load", completeHandler, false);
ajax.addEventListener("error", errorHandler, false);
ajax.addEventListener("abort", abortHandler, false);
ajax.send(formdata);
ajax.onreadystatechange = function() {
if (ajax.readyState === 4) {
alert("File uploaded successfully");
}
};
}
function progressHandler(event){
_("loaded_n_total").innerHTML = "Uploaded "+event.loaded+" bytes of "+event.total;
var percent = (event.loaded / event.total) * 100;
_("progressBar").value = Math.round(percent);
_("status").innerHTML = Math.round(percent)+"% uploaded... please wait";
}
function completeHandler(event){
_("status").innerHTML = event.target.responseText;
_("progressBar").value = 0;
}
function errorHandler(event){
_("status").innerHTML = "Upload Failed";
}
function abortHandler(event){
_("status").innerHTML = "Upload Aborted";
}`
在我完成任务的方式上是否有明显的错误。我唯一的想法是我的零件尺寸太小,无法上传。如果是这样的话,我确实可以用我一直在做的项目的另一个版本来解决这个问题。我只是花了太多的时间*在这个问题上,直到我意识到Parts参数应该嵌套在一个multiportupload条目中。我的代码现在如下所示:
$completeParams = Array(
'Bucket' => $multipartUpload['Bucket'],
'Key' => $multipartUpload['Key'],
'MultipartUpload' => Array(
'Parts' => $parts,
),
'UploadId' => $multipartUpload['UploadId']
);
$res = $client->completeMultipartUpload($completeParams);
这很好用。至少在使用SDK版本3时。SDK的版本2要求部件直接使用$params
*我不会透露多少分钟这真的很有用-没有任何文档或示例提到这一点!
$completeParams = Array(
'Bucket' => $multipartUpload['Bucket'],
'Key' => $multipartUpload['Key'],
'MultipartUpload' => Array(
'Parts' => $parts,
),
'UploadId' => $multipartUpload['UploadId']
);
$res = $client->completeMultipartUpload($completeParams);