使用Mongoose讓你簡單快樂地上傳檔案
本文由碼農網 – 小峰原創翻譯,轉載請看清文末的轉載要求,歡迎參與我們的付費投稿計劃!
想簡單而快樂地上傳任何大小的檔案?那麼你肯定需要Mongoose。
下面是你的步驟
首先,我們需要一個有“上傳按鈕”的網頁,它可能是這樣的:
<html><body>Upload example <form method="POST" action="upload ectype="multipart/form-data"> <input type="file" name="file" /> <br/> <input type="submit" value="Upload"/>
現在,我們需要實現一個事件處理程式。通常是Mongoose事件處理程式。這是它的開頭:
static void handle_upload(struct mg_connection *nc, int ev, void *p) { struct file_writer_data *data = (struct file_writer_data *) nc->user_data; struct mg_http_multipart_part *mp = (struct mg_http_multipart_part*)p;
看一看mg_http_multipart_part結構。它包含有關上傳過程的有用資訊。
在處理程式中,我們需要關注下列事件:
MG_EV_HTTP_PART_BEGIN:新傳入的資料請求,我們可以在這裡做一些準備。例如,我們可以開啟該檔案。
case MG_EV_HTTP_PART_BEGIN: ..... data = calloc(1, sizeof(struct file_writer_data)); /* We use temp file, but it is possible to use real file name; mp->file_name contains it */ data->fp = tmpfile(); data->bytes_written = 0; ....
MG_EV_HTTP_PART_DATA:資料迴圈讀取,mp包含指標資料和它的長度。在這裡寫到檔案中。
case MG_EV_HTTP_PART_DATA: ... fwrite(mp->data.p, 1, mp->data.len, data->fp ....
MG_EV_HTTP_PART_END:資料完成後,及時關閉檔案。
case MG_EV_HTTP_PART_END: .... fclose(data->fp); ....
整理到一起:
static void handle_upload(struct mg_connection *nc, int ev, void *p) { struct file_writer_data *data = (struct file_writer_data *) nc->user_data; struct mg_http_multipart_part *mp = (struct mg_http_multipart_part*)p; switch (ev) { case MG_EV_HTTP_PART_BEGIN: { if (data == NULL) { data = calloc(1, sizeof(struct file_writer_data)); data->fp = tmpfile(); data->bytes_written = 0; if (data->fp == NULL) { mg_printf(nc, "%s", "HTTP/1.1 500 Failed to open a file\r\n" "Content-Length: 0\r\n\r\n"); nc->flags |= MG_F_SEND_AND_CLOSE; return; } nc->user_data = (void *) data; } break; } case MG_EV_HTTP_PART_DATA: { if (fwrite(mp->data.p, 1, mp->data.len, data->fp) != mp->data.len) { mg_printf(nc, "%s", "HTTP/1.1 500 Failed to write to a file\r\n" "Content-Length: 0\r\n\r\n"); nc->flags |= MG_F_SEND_AND_CLOSE; return; } data->bytes_written += mp->data.len; break; } case MG_EV_HTTP_PART_END: { mg_printf(nc, "HTTP/1.1 200 OK\r\n" "Content-Type: text/plain\r\n" "Connection: close\r\n\r\n" "Written %ld of POST data to a temp file\n\n", (long) ftell(data->fp)); nc->flags |= MG_F_SEND_AND_CLOSE; fclose(data->fp); free(data); nc->user_data = NULL; break; } } }
不要忘了建立監聽連線:
nc = mg_bind(&mgr, "1234", ev_handler);
以及,註冊HTTP埠(此為可選專案):
mg_register_http_endpoint(nc, "/upload", handle_upload);
以上是基礎。Mongoose 將處理其餘部分。
你必須知道的兩件事
你可以使用同樣的方法上傳檔案到嵌入式裝置。Mongoose會快速解析multipart請求和問題事件,正如我們前面所描述的那樣,而不必等待整個請求被緩衝。所以,你可以上傳千兆位元組的檔案,即使你的裝置的記憶體只有幾KB。
並且,Mongoose能做的不僅如此。如果你需要的只是儲存上傳的檔案到檔案系統(而不是程式設計快閃記憶體晶片等),那麼你可以使用mg_file_upload_handler輔助函式。在這種情況下,事件處理程式變成了:
void ev_handler(struct mg_connection *nc, int ev, void *ev_data) { switch (ev) { ... case MG_EV_HTTP_PART_BEGIN: case MG_EV_HTTP_PART_DATA: case MG_EV_HTTP_PART_END: mg_file_upload_handler(nc, ev, ev_data, upload_fname); break; } }
非常簡單。
你可以在這裡下載完整的原始碼。
譯文連結:http://www.codeceo.com/article/mongoose-upload-file.html
英文原文:A Simple Way to Upload Files Using Mongoose
翻譯作者:碼農網 – 小峰
[ 轉載必須在正文中標註並保留原文連結、譯文連結和譯者等資訊。]
相關文章
- SpringMvc本地上傳檔案SpringMVC
- Mongoose簡單使用步驟Go
- 如何讓你的大檔案上傳變得又穩又快?
- 簡單的檔案快取函式快取函式
- 一個.Net Core開源快取中介軟體,讓你更加簡單、方便使用快取快取
- 使用nodejs+express完成簡單的檔案上傳功能NodeJSExpress
- ChinaJoy2015:讓快樂更簡單 追求遊戲本質遊戲
- 簡單檔案的上傳與儲存
- 揭秘|國內影視檔案傳輸的真相,跨境檔案傳輸更不簡單
- 使用Mongoose類庫實現簡單的增刪改查Go
- 單個檔案上傳和批量檔案上傳
- 功能分享丨超簡單快速檔案傳輸方式
- linux下簡單的傳送與接受檔案Linux
- socket實現簡單傳檔案ftp/scp服務FTP
- SpringMVC 單檔案上傳與多檔案上傳SpringMVC
- QSpace Pro 4 多皮膚檔案管理器,讓你的工作更簡單、更高效
- YII2檔案上傳驗證,簡單封裝封裝
- spring mvc(註解)上傳檔案的簡單例子SpringMVC單例
- 簡單好用的ftp檔案傳輸工具:Viper FTP for MacFTPMac
- 簡單實現TCP下的大檔案高效傳輸TCP
- 【解密】什麼樣的跨網檔案擺渡軟體 可以讓傳輸又簡單又安全?解密
- 讓你的Exe檔案減減肥
- 【Jeffrey Zhao 】讓UpdatePanel支援上傳檔案
- 快取函式的簡單使用快取函式
- mysql查詢快取簡單使用MySql快取
- Nginx 快取使用指南-簡單Nginx快取
- http不使用Form表單傳送檔案資料和非檔案資料(上傳篇)HTTPORM
- SpringMVC檔案上傳下載(單檔案、多檔案)SpringMVC
- php單個檔案上傳PHP
- [Vue]寫一個簡單的檔案上傳控制元件Vue控制元件
- input file簡單實現限制上傳檔案的型別型別
- python寫的FTP簡單上傳下載檔案薦PythonFTP
- 簡要指南:如何快樂工作
- 簡單十步讓你全面理解SQLSQL
- 焦急!我需要儘快傳送大檔案!
- 還在使用檔案傳輸協議傳輸機密檔案?你可能是對檔案傳輸協議有什麼誤會協議
- 使用fileinput上傳檔案
- wtfpd檔案傳輸使用