ruby-on-rails - Rails API : params' tempfile contains null bites from upload and fails to read, 但如果在本地抓取则读取正常

标签 ruby-on-rails ruby csv file-upload

我尝试在 Rails API 中设置一个简单的流程。业务逻辑已经实现并正常工作,但我在从包含 CSV 的参数中获取临时文件时遇到问题,该 CSV 将通过处理前端的 Ember 应用程序上传。这是我的 Controller 代码:

def update_by_csv
  good_csv    = CSV.read("spec/fixtures/single_field_lien_update_csv.csv")
  bad_csv       = CSV.read(params[:liens_csv].tempfile)
  fields        = good_csv.first
  values        = good_csv[1..-1]
  update_data   = values.map do |row|
    lien = {}
    row.each_with_index do |val, index|
      lien[fields[index]] = val
    end
    lien
  end.map(&:symbolize_keys)

  liens = update_data.map { |lien_data| Lien.find(lien_data[:id]) }

  if columns_updateable? fields
    liens.each_with_index { |lien, i| lien.update(update_data[i]) }
    require 'pry'; binding.pry
    render json: liens, status: :accepted
  else
    # render_bad_request_for(liens)
  end
end

这是相关的测试:

describe 'POST #update_by_csv' do
  context 'when uploading a csv with lien ids' do
    it 'can update fields via a csv' do
      payload = { liens_csv: fixture_file_upload("single_field_lien_update_csv.csv", "text/csv") }
      url = "http://api.lvh.me:3000/liens/update_by_csv.json"
      post url, payload, @subscribed_headers
      expect(response).to have_http_status(:accepted)
    end
  end
end

这是正在上传的 CSV:

id,face_value,county_held
1,954,butts
2,2054,butts
3,9054,butts
4,42954,butts
5,29054,butts1

当我尝试通过 CSV.read(params[:liens_csv].tempfile) 访问 CSV 时,我得到以下信息:

[["id", "face_value"],
 ["1", "10314"],
 ["2", "314931"],
 ["3", "42950"],
 ["4", "3295"],
 ["5", "31059"],
 ["\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"]]

然而,当它通过 CSV.read("spec/fixtures/single_field_lien_update_csv.csv") 访问时,我没有问题:

[["id", "face_value", "county_held"],
["1", "954", "butts"],
["2", "2054", "butts"],
["3", "9054", "butts"],
["4", "42954", "butts"],
["5", "29054", "butts1"]]

我不确定在临时文件/上传过程中到底是什么导致了这个问题。上传的文件与直接正确解析的文件完全相同。还可能值得注意的是,出于此测试的目的,CSV 是使用 Ruby 的 CSV 库生成的,因此我认为这不是该部分的编码问题。

想法?我真的很难过。

最佳答案

您能否将您的临时文件复制到您的 fixture 目录,然后尝试使用 ember 输出的完全相同的数据?

其实我能想到的唯一麻烦就是编码问题,\r\n 回车,utf-8/ansi 问题。

这就是我尝试修复它的方式:

def update_by_csv
   good_csv    = CSV.read("spec/fixtures/single_field_lien_update_csv.csv")
   # Keep it for further informations
   File.write(Rails.root.join("spec/fixtures/single_field_lien_update_csv_bad.csv"), File.read(params[:liens_csv].tempfile))
   raise "STOP"
   bad_csv       = CSV.read(params[:liens_csv].tempfile)
   #...
end

关于ruby-on-rails - Rails API : params' tempfile contains null bites from upload and fails to read, 但如果在本地抓取则读取正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33506511/

相关文章:

ruby-on-rails - ruby : "&& return"与 "and return"

python - B 列中具有匹配 A 列值的行的总和值

python - 将一系列数字更改为列表,python

ruby-on-rails - 在 MRI 和 jruby 之间切换的 Shell 脚本

ruby-on-rails - 在 Rails 命名空间 Controller 中调用 form_for 时无法解决 "ArgumentError: Missing block"

ruby-on-rails - 使用 Rspec + Factory Girl 在新线程/进程测试中数据库为空

ruby-on-rails - Arel,如何加入

ruby-on-rails - nokogiri 和 xpath -- 数据集的嵌套循环

ruby - be_valid 匹配器如何知道某些内容实际上是有效的

java - 如何转义 CSV 文件中的逗号?