2013-03-13 82 views
1

我快到了,但是我遇到了解碼文件的問題。解碼文件時不正確。ember文件上傳到rails,使用base64進行編碼和解碼

,我用它來上傳文件中的代碼:

createDataSet: function() { 
    var data = new FormData(); 
    data.append('original_filename', this.get('fileName')); 
    data.append('datafile', this.get('newData')); 
    data.append('project_id', this.get('content.id')); 
    data.append('name', this.get('content.name')); 
    $.ajax({ 
     url: '/data_sets.json', 
     data: data, 
     cache: false, 
     contentType: false, 
     processData: false, 
     dataType: 'json', 
     type: 'POST', 
     success: function(data) { 
     alert('ok'); 
     }, 
     error: function(xhr, data, errorThrown) { 
     alert('error'); 
     } 
    }); 
    } 

在鐵軌邊,我想用下面的方法來挑這個了:如果我使用File.open(datasetfilename, 'w')

def create 
    # take care of the attachement 
    datasetfilename = Pathname.new(params[:original_filename]).basename 
    newfile = File.open(datasetfilename, 'w') do |f| 
     f.write(Base64.decode64(params[:datafile])) 
    end 

    @dataset = DataSet.new 
    @active_data_set = @dataset.active_data_sets.build 
    @active_data_set.project_id = params[:project_id] 
    @active_data_set.save 
    @dataset.name = params[:name] 
    @dataset.filename = datasetfilename 
    @dataset.tempfilename = @dataset.savefile newfile 
    @dataset.save 
    end 

我得到這樣一個錯誤Encoding::UndefinedConversionError - "\xAB" from ASCII-8BIT to UTF-8。另一方面,如果我用'wb'打開,則生成的文件混在一起,無法讀取。

我已經爲文件編碼<meta charset="utf-8" />添加了元標記,但沒有任何區別。

如果有人有任何暗示,將不勝感激。

+0

如果調用FORMDATA形式DOM對象上它會爲你的文件,從文件類型的輸入編碼:新FORMDATA($('形式「));否則,您需要在將文件添加到FormData對象之前對其進行編碼。 – buuda 2013-03-13 14:02:39

+0

目前的設置上面的參數看起來像「datafile」=>「data:text/csv; base64,SUR4CUluZ ...這就是爲什麼我認爲它已經在base64編碼 – Rudi 2013-03-13 14:25:55

+0

我結束了使用[jquery- fileupload](https://github.com/blueimp/jQuery-File-Upload),這使得它非常簡單。 – Rudi 2013-03-14 13:11:48

回答

5

剛剛得到這個工作在我自己的控制器之一,有2個主要問題:

1)來解決編碼問題,請使用「W:二進制」作爲寫標誌,而不是「W」(默認到ASCII)

2):數據文件參數包括一些標題信息「data:text/csv; base64,SUR4CUluZ ...」,我目前正在拆分「,」但可能更好地解碼所有內容「base64」,因爲我不確定是否允許附加逗號。

我的工作代碼(略有不同的參數名稱):

if params.key?(:img_file) 
    header, data = params[:img_file].split(',') 
    img_type = header.match(/image\/([a-z]{1,11});/)[1] 
    file_path = "imgtodo/fund_#{@fund.id}.#{img_type}" 
    File.open(Rails.root.join('public',file_path).to_s, 'w:binary') do |f| 
    f.write(Base64.decode64(data)) 
    end 
end