Fatal error: Uncaught Aws\S3\Exception\InvalidRequestException: AWS Error Code: InvalidRequest, Status Code: 400, AWS Request ID: B1A28EBE65521DF4, AWS Error Type: client, AWS Error Message: You must specify at least one part, User-Agent: aws-sdk-php2/2.7.22 Guzzle/3.9.2 curl/7.40.0 PHP/5.6.6 thrown in C:\vhosts********.com\db*****\FileUploader_v2\aws\Aws\Common\Exception\NamespaceExceptionFactory.php on line 91
每当我使用 AWS S3 运行我的分段上传程序时,我都会收到上述错误。我的程序应该在 JS 脚本中分割文件的一部分,然后使用 XMLHTTPRequest 将其发送到 php 脚本。那部分似乎运作良好。但是,调用 CompleteMultipartUpload 时会出现问题。我从错误中了解到我的零件太小或为空。
上传.htm:
var 命令;
变种文件;
变种所有者名称;
变量总大小;
变量 partSize = 2 * 1024 * 1024;//持续的
变种sendBackData;
变量总大小;
var sureUploadSize = 0, probableUploadSize = 0;
变量编号;
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";
}`
FileUploader.php: `
//require 'SimpleImage.php';
//require 'gifsplit.php';
//require 'functions.php';
require 'config.php';
require 'aws/aws-autoloader.php';
use Aws\Common\Exception\MultipartUploadException;
use Aws\S3\Model\MultipartUpload\UploadBuilder;
use Aws\S3\S3Client;
use Aws\S3\Exception\S3Exception;
function sendJson($arr)
{
header('Content-Type: application/json');
die(json_encode($arr));
}
// S3
$s3 = S3Client::factory(array(
'key' => AWS_KEY,
'secret' => AWS_SECRET_KEY
));
//$part = $_POST['part'];
switch ($_POST['command']) {
case 'CreateMultipartUpload':
$key = "other/".$_POST['name']."/".$_POST['filename'];
$response = $s3->createMultipartUpload(array(
'Bucket' => TMP_IMG,
'Key' => $key
));
$uploadId = $response['UploadId'];
sendJson(array(
'uploadId' => $uploadId,
'key' => $key
));
break;
case 'UploadPart':
var_dump($_FILES['file']);
$result = $s3->uploadPart(array(
'Bucket' => TMP_IMG,
'Key' => $_POST['key'],
'UploadId' => $_POST['uploadId'],
'PartNumber'=> $_POST['partNumber'],
'Body' => $_FILES['file']['tmp_name']
));
break;
case 'CompleteMultipartUpload':
$partsModel = $s3->listParts(array(
'Bucket' => TMP_IMG,
'Key' => $_POST['key'],
'UploadId' => $_POST['uploadId']
));
$model = $s3->completeMultipartUpload(array(
'Bucket' => TMP_IMG,
'Key' => $_POST['key'],
'UploadId' => $_POST['uploadId'],
'Parts' => $partsModel['Parts']
));
sendJson(array(
'success' => true
));
break;
case 'AbortMultipartUpload':
# code...
break;
default:
# code...
break;
}
在我完成任务的过程中是否有明显错误的地方?我唯一的想法是我的零件尺寸对于上传来说太小了。如果是这样的话,我确实可以通过我一直在处理的项目的另一个版本来解决这个问题。
最佳答案
我只是在同一个问题上花了太多时间*,直到我意识到 Parts 参数应该嵌套在 MultipartUpload 条目中。我的代码现在看起来像这样:
$completeParams = Array(
'Bucket' => $multipartUpload['Bucket'],
'Key' => $multipartUpload['Key'],
'MultipartUpload' => Array(
'Parts' => $parts,
),
'UploadId' => $multipartUpload['UploadId']
);
$res = $client->completeMultipartUpload($completeParams);
而且效果很好。至少在使用 SDK 版本 3 时。 SDK 版本 2 需要直接在 $params 中的部件。
*我不会透露多少分钟
关于php - Aws S3 CompleteMultipartUpload 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30383982/
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test
我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c
我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file
我克隆了一个rails仓库,我现在正尝试捆绑安装背景:OSXElCapitanruby2.2.3p173(2015-08-18修订版51636)[x86_64-darwin15]rails-v在您的Gemfile中列出的或native可用的任何gem源中找不到gem'pg(>=0)ruby'。运行bundleinstall以安装缺少的gem。bundleinstallFetchinggemmetadatafromhttps://rubygems.org/............Fetchingversionmetadatafromhttps://rubygems.org/...Fe
在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee
我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie
我有两个Rails模型,即Invoice和Invoice_details。一个Invoice_details属于Invoice,一个Invoice有多个Invoice_details。我无法使用accepts_nested_attributes_forinInvoice通过Invoice模型保存Invoice_details。我收到以下错误:(0.2ms)BEGIN(0.2ms)ROLLBACKCompleted422UnprocessableEntityin25ms(ActiveRecord:4.0ms)ActiveRecord::RecordInvalid(Validationfa
这个问题在这里已经有了答案:Arraysmisbehaving(1个回答)关闭6年前。是否应该这样,即我误解了,还是错误?a=Array.new(3,Array.new(3))a[1].fill('g')=>[["g","g","g"],["g","g","g"],["g","g","g"]]它不应该导致:=>[[nil,nil,nil],["g","g","g"],[nil,nil,nil]]
尝试在我的RoR应用程序中实现计数器缓存列时出现错误Unknownkey(s):counter_cache。我在这个问题中实现了模型关联:Modelassociationquestion这是我的迁移:classAddVideoVotesCountToVideos0Video.reset_column_informationVideo.find(:all).eachdo|p|p.update_attributes:videos_votes_count,p.video_votes.lengthendenddefself.downremove_column:videos,:video_vot