1

我快到了,但我在解码文件时遇到了问题。解码文件时不正确。

我用来上传文件的代码:

  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')我会收到这样的错误Encoding::UndefinedConversionError - "\xAB" from ASCII-8BIT to UTF-8。另一方面,如果我打开'wb'结果文件是混合的并且无法读取。

我已经为文件编码添加了元标记,<meta charset="utf-8" />但没有任何区别。

如果有人有任何提示,将不胜感激。

4

1 回答 1

6

刚刚在我自己的一个控制器中工作,有两个主要问题:

1) 要解决编码问题,请使用“w:binary”作为写入标志而不是“w”(默认为 ASCII)

2) :datafile 参数包括一些标题信息“data:text/csv;base64,SUR4CUluZ...”,我目前正在拆分“”,但可能更好地解码“base64”以外的所有内容,因为我m 不确定是否允许使用额外的逗号。

我的工作代码(参数名称略有不同):

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
于 2013-05-08T09:32:12.663 回答