2013-03-13 2 views
1

Я почти у меня есть, но у меня проблема с расшифровкой файла. При декодировании файл неправильный.Загрузка файла ember в рельсы, кодирование и декодирование с 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'); 
     } 
    }); 
    } 

На стороне Rails Я пытаюсь забрать это с помощью следующего метода:

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 

Если я использую File.open(datasetfilename, 'w') I получите ошибку, подобную этой Encoding::UndefinedConversionError - "\xAB" from ASCII-8BIT to UTF-8. С другой стороны, если я открываю с 'wb', результирующий файл смешивается и не может быть прочитан.

Я уже добавил метатег для кодировки файла <meta charset="utf-8" />, но без какой-либо разницы.

Если у кого-нибудь есть намек, который будет оценен.

+0

Если вы звоните FormData на объект формы DOM будет кодировать файл для вас от входа типа файла: новый FormData ($ ('форма «)); В противном случае вам нужно будет закодировать файл перед его добавлением в объект FormData. – buuda

+0

На данный момент с настройкой выше параметры выглядят как «datafile» => «data: text/csv; base64, SUR4CUluZ ... Вот почему я предположил, что он был закодирован уже в base64. – Rudi

+0

В итоге я использовал [jquery- fileupload] (https://github.com/blueimp/jQuery-File-Upload), что сделало его очень простым. – Rudi

ответ

5

Только что получил эту работу в одном из моих собственных контроллеров, есть 2 основные проблемы:

1), чтобы решить эту проблему кодирования, используйте «w: двоичный» в качестве флага записи вместо «ш» (по умолчанию к ASCII)

2) параметры datafile включают в себя некоторые данные заголовка «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 
Смежные вопросы