[英]Uploading Base64 image data to S3 via AWS Ruby SDK
我有一個拖放功能,它會刪除已經刪除的文件並將其轉換為Base64數據。 以前,它上傳到Imgur,其API支持Base64上傳,現在我正在努力轉移到Amazon S3。
我已經看到人們使用XMLHTTP請求和CORS將數據上傳到S3的示例 ,我正在使用亞馬遜的AWS S3 SDK gem來避免簽署策略和其他事情,因為gem為我做了這些。 所以我所做的就是將Base64數據發送到本地控制器metod,它使用gem上傳到S3。
使用Ajax的其他帖子我已經看到S3顯示S3支持原始數據上傳,但是看起來並不好,因為每當我查看上傳時我都會看到破碎的圖像。 我上傳的不正確嗎? 數據格式是否錯誤? 我已經嘗試了基本的Base64,atob Base64和blob網址,但到目前為止還沒有任何工作。
JS:
fr.onload = function(event) {
var Tresult = event.target.result;
var datatype = Tresult.slice(Tresult.search(/\:/)+1,Tresult.search(/\;/));
var blob = atob(Tresult.replace(/^data\:image\/\w+\;base64\,/, ''));
$.ajax({
type:"POST",
data:{
file:blob,
contentType: datatype,
extension:datatype.slice(datatype.search(/\//)+1)
},
url:'../uploads/images',
success:function(msg) {
handleStatus(msg,"success");
},
error:function(errormsg) {
handleStatus(errormsg,"error");
}
});
}
控制器方法:
def supload
s3 = AWS::S3.new(:access_key_id => ENV['S3_KEY'],:secret_access_key => ENV['S3_SECRET'])
bucket = s3.buckets['bucket-name']
data = params[:file].to_s
type = params[:contentType].to_s
extension = params[:extension].to_s
name = ('a'..'z').to_a.shuffle[0..7].join + ".#{extension}"
obj = bucket.objects.create(name,data,{content_type:type,acl:"public_read"})
url = obj.public_url().to_s
render text: url
end
編輯:
為了清楚起見,我嘗試了幾種不同的格式,上面顯示的格式是base64。 常規Base64如下所示:
var Tresult = event.target.result;
var datatype = Tresult.slice(Tresult.search(/\:/)+1,Tresult.search(/\;/));
var blob = Tresult;
$.ajax({
type:"POST",
data:{
file:blob,
mimeType: datatype,
extension:datatype.slice(datatype.search(/\//)+1)
},
url:'../uploads/images',
success:function(msg) {
handleStatus(msg,"success");
},
error:function(errormsg) {
handleStatus(errormsg,"error");
}
});
並且blob網址看起來像這樣:
var blob = URL.createObjectURL(dataURItoBlob(Tresut,datatype));
...
function dataURItoBlob(dataURI, dataType) {
var binary = atob(dataURI.split(',')[1]);
var array = [];
for(var i = 0; i < binary.length; i++) {
array.push(binary.charCodeAt(i));
}
return new Blob([new Uint8Array(array)], {type: dataType});
}
我是否正確地讀到你:
如果是這種情況,則需要先將步驟2中的數據解碼,然后再將其發送到S3。 像這樣的東西可能會起作用:
require "base64"
def supload
s3 = AWS::S3.new(:access_key_id => ENV['S3_KEY'],:secret_access_key => ENV['S3_SECRET'])
bucket = s3.buckets['bucket-name']
data = Base64.decode64(params[:file].to_s)
type = params[:contentType].to_s
extension = params[:extension].to_s
name = ('a'..'z').to_a.shuffle[0..7].join + ".#{extension}"
obj = bucket.objects.create(name,data,{content_type:type,acl:"public_read"})
url = obj.public_url().to_s
render text: url
end
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.