在Rails上读取上传的数据

时间:2015-05-09 14:30:45

标签: ruby-on-rails http post upload pcap

我正在使用rails服务器从应用程序接收数据。 一个简单的POST请求接收器实现如下:

  #POST /pcap_uploads/curl
  def curl
    filename||= "#{SecureRandom.urlsafe_base64}.pcap"
    tempfile = Tempfile.new(filename)
    tempfile.binmode
    tempfile << request.body.read
    tempfile.rewind
    data_params = params.slice(:filename).merge(:tempfile => tempfile)
    data = ActionDispatch::Http::UploadedFile.new(data_params)
    File.open(File.join(Rails.root, "/public/uploads/" << filename), 'w+b') { |f| 
        data.rewind
        while  !data.eof?
          f.write(data.read)
        end
    }
    respond_to do |format|
        format.json { head :ok }
    end
  end

我的问题是写入的数据包含我的二进制文件(pcap格式),其中包含POST请求信息,例如:

--------------------------5625702e57f980bd
Content-Disposition: form-data; name="file"; filename="capture.pcap"
Content-Type: application/octet-stream

<binaryfile content>
--------------------------5625702e57f980bd--

我无法在不改变内容的情况下找到删除这些行的方法。 有人知道我做错了吗?

2 个答案:

答案 0 :(得分:0)

实际上,我可以简单地使用 params 中的:file参数。

      #POST /pcap_uploads/curl
  def curl
    filename||= "#{SecureRandom.urlsafe_base64}.pcap"
    #Rails.logger.debug params.inspect
    #puts params[:file].inspect
    data = params[:file]
    t=  data.tempfile
    File.open(File.join(Rails.root, "/public/uploads/" << filename), 'w+b') { |f| 
        t.rewind
        while  !t.eof?
          f.write(t.read)
        end
    }
    respond_to do |format|
        format.json { head :ok }
    end
   end

感谢Baldrick了解调试提示。

答案 1 :(得分:0)

我刚刚从official Rails documentation

留下处理文件上传的示例
def upload
  uploaded_io = params[:person][:picture]
  File.open(Rails.root.join('public', 'uploads', uploaded_io.original_filename), 'wb') do |file|
    file.write(uploaded_io.read)
  end
end