关于直接上传到Amazon S3的Heroku's tutorial之后。
通过Node.js应用程序从AWS获得签名请求后,他们使用" normal" class Room
{
val room = generate
def generate: Array[Char] =
{
var temp = Array[Char](10, 10)
for (i: Int <- 0 to temp.length; j: Int <- 0 to temp.length)
{
if (i == 0 || j == 0 || i == temp.length-1 || j == temp.length-1)
temp(i, j) = '#'
}
return temp
}
def print: Unit =
{
for (i <- 0 to 10)
{
var line: String = ""
for (j <- 0 to 10)
{
line += room(i, j)
}
println(line)
}
}
}
发送文件。
这是他们的功能:
XMLHttpRequest
现在,我正在与Cordova合作,因为我没有从相机插件中获取function upload_file(file, signed_request, url){
var xhr = new XMLHttpRequest();
xhr.open("PUT", signed_request);
xhr.setRequestHeader('x-amz-acl', 'public-read');
xhr.onload = function() {
if (xhr.status === 200) {
document.getElementById("preview").src = url;
document.getElementById("avatar_url").value = url;
}
};
xhr.onerror = function() {
alert("Could not upload file.");
};
xhr.send(file);
}
对象,只有文件URI,我使用了Cordova&#39; {{ 3}}使用File
将图片上传到我的Node.js应用程序,并且工作正常。
但是,我无法使其适用于Amazon S3。
以下是我所拥有的:
multipart/form-data
我已经尝试了$scope.uploadPhoto = function () {
$scope.getSignedRequest(function (signedRequest) {
if (!signedRequest)
return;
var options = new FileUploadOptions();
options.fileKey = 'file';
options.httpMethod = 'PUT';
options.mimeType = 'image/jpeg';
options.headers = {
'x-amz-acl': 'public-read'
};
options.chunkedMode = false;
var ft = new FileTransfer();
ft.upload($scope.photoURI, encodeURI(signedRequest.signed_request), function () {
// success
}, function () {
// error
}, options);
});
};
和chunkedMode = true
,但是既没有调用成功也没有调用错误回调。
那么,有没有办法使用chunkedMode = false
将文件上传到S3?
我是否真的需要签名请求,或者仅在我使用XHR时才需要它?
任何提示都表示赞赏。
答案 0 :(得分:4)
我最终在Cordova中使用了这个功能:
$scope.uploadPhoto = function () {
$scope.getSignedRequest(function (signedRequest) {
if (!signedRequest)
return;
var options = new FileUploadOptions();
options.chunkedMode = false;
options.httpMethod = 'PUT';
options.headers = {
'Content-Type': 'image/jpeg',
'X-Amz-Acl': 'public-read'
};
var ft = new FileTransfer();
ft.upload($scope.photoURI, signedRequest.signedUrl, function () {
$scope.$apply(function () {
// success
});
}, function () {
$scope.$apply(function () {
// failure
});
}, options);
});
};
重要位是设置Content-Type
标头,因此不会使用multipart/form-data
,chunkedMode = false
只需一个请求即可发送文件。
编辑:删除了对插件代码的更改,事后看来,这些更改是无用的(过时的插件)。
答案 1 :(得分:1)
无法添加评论: 奇怪。使用$ cordovaFileTransfer.upload为我工作。我没有'x-amz-acl':'public-read'标题。另外,我不在签名的URL上使用encodeURI。你能调试吗?看到任何错误?我使用chrome:// inspect和port forwarding连接到我在手机上运行的应用程序,因此我能够调试来自亚马逊的响应。可能是它失败的另一个原因。