簡體   English   中英

使用 lighttpd 上傳和存儲文件

[英]File upload and store with lighttpd

我在嵌入式平台上的 Linux 中運行 lighthttpd。

現在我想讓一個文件傳輸到系統成為可能,上傳網頁包含一個文件選擇器和“上傳”按鈕(帶有 HTML 標簽和)。 所選文件作為包含 multipart/form-data 的 POST HTTP 請求傳輸。 然后,該文件應簡單地作為常規文件存儲在文件系統中。

我已經有一個 CGI 接口,一個接收請求並將其傳遞給后端 C++ 應用程序的 bash 腳本。 而且因為它是一個嵌入式平台,我想避免只在這種情況下使用 php、python 等。

據我所知,lighttpd 無法將接收到的文件直接從多部分編碼的請求正文保存到純文件,對嗎?

為了解碼正文,我從 mpack 包中找到了“munpack”工具,該工具將編碼的正文寫入磁盤上的文件,但適用於 mime 編碼的電子郵件。 盡管如此,我可以在 CGI bash 腳本中調用它,它幾乎可以像預期的那樣工作,除了它無法處理終止邊界 id(在“Content-Type”中給出的邊界 id 附加兩個破折號),導致最后一個文件仍然包含最終邊界。 更新:這個 munpack 行為來自一個錯誤的腳本,但它仍然不起作用,當 body 包含 CRLF 行結尾時,munpack 會產生錯誤的文件; 只有 LF 產生正確的結果。

是否有任何其他直接請求磁盤文件的方法? 或者我真的必須在腳本中手動過濾終止邊界,或者在我的 C++ 應用程序中編寫一個多部分消息解析器?

為了明確用例:用戶應該能夠將固件文件上傳到我的系統。 所以他用網絡瀏覽器連接到我的系統,收到一個上傳頁面,他可以在其中選擇文件並使用“上傳”按鈕發送它。 然后,這個傳輸的文件應該簡單地存儲在我的系統上。 用於接收請求的 CGI 腳本確實已經存在(以及我也可以處理請求的 C++ 后端),唯一的問題是將 multipart/form-data 編碼文件轉換為磁盤上的普通文件。

現在我想讓通過 POST HTTP 請求將文件傳輸到系統成為可能。 該文件應該簡單地存儲為文件系統中的常規文件。

這聽起來更像是一個 HTTP PUT 而不是 HTTP POST。

據我所知,lighttpd 無法將接收到的文件直接從多部分編碼的請求正文保存到純文件,對嗎?

你的意思是 POST 的 application/x-www-form-urlencoded 嗎? 為什么要進行多部分編碼? 是否有多個文件正在上傳?

lighttpd mod_webdav支持 PUT。 否則,您需要自己的程序來處理請求正文,無論是 shell 腳本還是編譯程序。 您可以將 libfcgi 與您的 C++ 一起使用,或者您可以查看 lighttpd 用於測試的 C 程序,它們在不到 300 行 C 中實現了 FastCGI 和 SCGI。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM