2014-04-15 49 views
0

我正在編寫在db表中存儲記錄的Ruby-on-Rails應用程序(記錄數不超過200行)。每條記錄都與一個jpeg/png圖像或圖標(最大尺寸32x32)關聯。所以我的應用程序必須上載並將圖像保存在服務器上的特定文件夾中。我們上傳文件時位於臨時文件夾的位置

在文檔中它說:「params散列中的對象是IO子類的一個實例。根據上傳文件的大小,它實際上可能是一個StringIO或一個由臨時文件支持的文件實例「。

我的問題:位於服務器上的這個臨時文件夾在哪裏?它依賴於系統還是應用程序?

+0

爲什麼這很重要? – akatakritos

+0

只是好奇,如果它是應用程序依賴,那麼如何配置它們應該存儲的位置? – fade2black

回答

1

您的臨時文件的位置可能與系統有關,可能位於/tmp文件夾的某處。

但你真的不需要知道。

上傳的圖像可以作爲StringIO對象存儲在內存中,也可以保存到主機服務器上的臨時文件中。這是由rails提供的優化。如果圖像足夠小,Rails將向您傳遞一個StringIO對象,該對象基本上是加載到內存中的整個圖像。如果圖像較大,它會傳遞一個表示磁盤上臨時文件的實例。

你想將它保存到一個已知的文件夾,比如說uploads。您無需關心圖像是存儲在內存中還是存儲在磁盤上。

StringIO對象和臨時文件備份對象均響應:read方法。你所要做的就是調用read來獲取數據,然後將它寫出到你想要的位置。

image_as_io = params[:image] 
filename = ... # determine a filename for the image 

File.open(Rails.root.join('public', 'uploads', filename), 'wb') do |file| 
    file.write(image_as_io.read) 
end 
+0

謝謝!我知道我不需要知道臨時文件的位置以存儲上傳的文件。我只是想知道文件上傳時幕後發生了什麼。 – fade2black

+0

我假定它是一個'Tempfile'的實例,所以它會有一個'path'方法,你可以檢查你是否真的想知道。 – akatakritos

+0

好主意!我會檢查。 – fade2black