簡體   English   中英

通過AWS Ruby SDK將Base64圖像數據上傳到S3

[英]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});
}

我是否正確地讀到你:

  1. 使用AJAX將Base64編碼的文件發送到Rails
  2. 使用Rails將文件上傳到S3
  3. 在S3中查看文件?

如果是這種情況,則需要先將步驟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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM