2010-02-26 55 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