我在rails应用程序中安装了camt_parser gem。 我的目标是上传和解析camt_file(.xml)。
当我以这种方式从本地文件解析时,它的工作正常:
require 'camt_parser'
require 'camt'
camt = CamtParser::File.parse 'CAMT053_140518.xml'
puts camt.group_header.creation_date_time
camt.statements.each do |statement|
statement.entries.each do |entry|
# Access individual entries/bank transfers
# puts "->"
puts entry.description
puts entry.debit
p entry.transactions[0].iban
p entry.transactions[0].transaction_id
puts entry.transactions[0].debitor.iban
end
end
但是当我尝试使用此代码将其作为文件从我的视图上传时:
<%= form_tag '/patient_page/import_camt', :multipart => true do %>
<label for="file">Upload text File</label> <%= file_field_tag "file" %>
<%= submit_tag %>
<% end %>
和
相应的方法:
def import_camt
uploaded_file = params[:file]
parsed_file = uploaded_file.read
camt = CamtParser::File.parse uploaded_file
puts camt.group_header.creation_date_time
camt.statements.each do |statement|
statement.entries.each do |entry|
puts entry.description
puts entry.debit
p entry.transactions[0].iban
p entry.transactions[0].transaction_id
puts entry.transactions[0].debitor.iban
end
end
end
我收到以下错误
“没有将ActionDispatch :: Http :: UploadedFile隐式转换为String” 在我尝试解析上传文件时的行。
任何提示?
THX!
答案 0 :(得分:0)
CamtParser::File.parse
期待文件路径但您传递的是ActionDispatch::Http::UploadedFile
对象。
在rails中上传文件时,文件将包含在ActionDispatch::Http::UploadedFile
的实例中。要访问文件本身,有一个名为tempfile
的属性。
这将返回代表正在上传的实际文件的Tempfile
。 Tempfile
有一个path
方法,它是文件本身的路径,因此CamtParser::File.parse
期待文件路径,可以按如下方式调用
CamtParser::File.parse(uploaded_file.tempfile.path)
CamtParser
还有一个String
类,可以解析相应的字符串,因此您可以将其称为
CamtParser::String.parse(uploaded_file.read)
这是有效的,因为ActionDispatch::Http::UploadedFile
公开方法read
,这与调用uploaded_file.tempfile.read