2010-02-26 22 views
1

以我控制器request.body.read结果是:如何读取格式数据用红宝石

============= 
--AJAX-----------------------1267183973160 
Content-Disposition: form-data; name="1261400603_page_white_word.png"; filename="1261400603_page_white_word.png" 
Content-Type: application/octet-stream 

thefile 
--AJAX-----------------------1267183973160 
Content-Disposition: form-data; name="1261400536_page_white_excel.png"; filename="1261400536_page_white_excel.png" 
Content-Type: application/octet-stream 

thefile 
--AJAX-----------------------1267183973160-- 
============= 

它包含n个表格数据(在我的示例2),我的目标是循环通过n形状配合数据并获取数据name,filename并上传了一个文件,在我的例子中我用thefile替换了二进制数据。

这里是params哈希表的

{"action"=>"create", "controller"=>"photos", "1265144945_395.jpg"=>#<File:/var/folders/BT/BTpdsWBkF6myaI-sl3+1NU+++TI/-Tmp-/RackMultipart20100226-273-1un364r-0>} 

干杯

+0

什么是'params'散列? – MBO 2010-02-26 12:22:58

+0

我添加了参数内容... – denisjacquemin 2010-02-26 12:41:29

+0

是否存在由params指向的文件?它的内容是什么? – anshul 2010-02-26 13:27:26

回答

2

你有没有考虑使用paperclipattachment_fu的内容?他们经过战斗测试,并会比使用request.body做得更好。无论如何,你可以按如下方式解析request.body,但这不是最好的解决方案。

inputs = request.body.read.split(/--ajax-+\d+-*/mi) 

inputs.each do |input| 
    input.scan(/(.*)[\n\r]{2,4}(.*)/m) do |header, file| 
    header.scan(/name=["'](.*)["'];\s+filename=["'](.*)["']/) do |name, filename| 
     puts name 
     puts filename 
    end 
    puts file 
    end 
end 

编辑:所以PARAMS解析大概是Rack::Utils::Multipart.parse_mulitpart工作。人们应该重新使用来源的正则表达式来解析这个更强大。另外,它看起来像机架正在为你创建一个tmp文件。你能检查该文件的内容吗?

+0

好吧,数据是通过ajax请求与sendAsBinary(只有Firefox 3)提交的,回形针没有捕获该文件(不知道为什么!),请参阅http://stackoverflow.com/questions/2306910/paperclip-and-xhr-sendasbinary和http://stackoverflow.com/questions/2325827/diff-between-xhr-sendasbinary-and-classic-file-submit-in-http-request非常感谢 – denisjacquemin 2010-02-26 13:03:28

+0

..我已经看到了这两个问题中的第一个,想知道答案是什么... – anshul 2010-02-26 13:09:04

+0

答复在这里http://stackoverflow.com/q uestions/2306910 /纸夹和 - XHR-sendasbinary / – denisjacquemin 2010-02-26 22:42:05