Apache Tomcat 設定最大檔案上傳大小

Apache Tomcat 設定最大檔案上傳大小

我正在實作一個 Grails/Groovy Web 應用程序,我想限制用戶的文件上傳大小,我不希望有人上傳 10GB 檔案到我的伺服器。我發現大多數計算大小的方法都是在檔案上傳後完成的,如果有人提出 10 個設定檔並上傳 10 個大小為 10GB 的檔案呢?這會耗盡伺服器的資源並佔用伺服器磁碟上的大量空間。所以我正在努力阻止這種情況發生。

我發現 Apache Tomcat 允許採用硬編碼或註解方法進行以下配置。我不確定最大檔案大小是在上傳過程中還是在檔案上傳到臨時位置之後計算的。該文件表明以下內容:

@MultipartConfig 註解支援以下可選屬性:

location:檔案系統上目錄的絕對路徑。位置屬性不支援相對於應用程式上下文的路徑。此位置用於在處理部件時或當檔案大小超過指定的 fileSizeThreshold 設定時暫時儲存檔案。預設位置是“”。

fileSizeThreshold:檔案大小(以位元組為單位),超過該大小後檔案將暫時儲存在磁碟上。預設大小為 0 位元組。

MaxFileSize:允許上傳的檔案的最大大小,以位元組為單位。如果任何上傳檔案的大小大於此大小,Web 容器將拋出例外 (IllegalStateException)。預設大小是無限的。

maxRequestSize:多部分/表單資料請求允許的最大大小(以位元組為單位)。如果所有上傳檔案的總大小都超過此閾值,Web 容器將引發異常。預設大小是無限的。

註解方法:

@MultipartConfig(location="/tmp", fileSizeThreshold=1024*1024, 
    maxFileSize=1024*1024*5, maxRequestSize=1024*1024*5*5)

這是硬編碼值:

<multipart-config>
<!– 50MB max –>
<max-file-size>52428800</max-file-size>
<max-request-size>52428800</max-request-size>
<file-size-threshold>0</file-size-threshold>
</multipart-config>

如果有人能澄清 MaxFileSize 是否是在上傳過程中計算的,我將不勝感激。

答案1

MaxFileSize 將在整個檔案上傳後計算。您可以在網頁應用程式上傳一個檔案(1GB 大小),然後您會注意到到底發生了什麼事。所以依賴 Tomcat 是沒有意義的。在 Servlet 中做同樣的工作是可能的,但是當你的計數器達到 MaxFileSize 時,你如何斷開底層的 HTTP 連線呢?我想你也沒有辦法。 HTTP協定是單向的,所以你也不能告訴瀏覽器及時取消長貼文。您唯一能做的就是當計數器達到閾值時,忽略輸入流中的後續位元組以保護磁碟空間,直到檔案傳輸完成。

相關內容