【问题标题】:ember file upload to rails, encoding and decoding with base64ember文件上传到rails,用base64编码和解码
【发布时间】:2013-03-01 11:46:28
【问题描述】:

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

我用来上传文件的代码:

  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" />,但没有任何区别。

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

【问题讨论】:

  • 如果您在表单 DOM 对象上调用 FormData,它将从文件类型的输入为您编码文件: new FormData($('form'));否则,您需要在将文件添加到 FormData 对象之前对文件进行编码。
  • 目前使用上面的设置,参数看起来像 "datafile"=>"data:text/csv;base64,SUR4CUluZ... 这就是为什么我认为它已经在 base64 中编码。
  • 我最终使用了jquery-fileupload,这让它变得非常简单。

标签: ruby-on-rails ajax file-upload ember.js decode


【解决方案1】:

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

1) 要解决编码问题,请使用“w:binary”作为写入标志而不是“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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-19
    • 1970-01-01
    • 2019-08-03
    • 1970-01-01
    相关资源
    最近更新 更多