HTTP multipart/form-data 請求

序言

?最近在寫項目的過程中有一個需求是利用 HTTP 協議傳輸圖片和視頻,經過查詢方法相應的方法發現使用 multipart/form-data 的方式,這是最常見處理二進制文件的表單編碼類型。
?學習了一下午,現在總結一下使用的方法和相關的知識點,歡迎指正😄!


一、如何使用?

?? 注:我們的開發語言是 C++,主要使用到的庫是 httplib,幫助我們快速的搭建HTTP 服務器,以及相應數據的處理

1. 前端邏輯

?首先我們配合使用 httplib 快速的搭建一個網絡首頁:
在這里插入圖片描述

這里界面有些簡陋哈哈,但是學習的意義大于外表!

這里需要用戶填寫昵稱和一個圖片(分別對應純文本數據圖片數據稍后形成對比)。前端的代碼非常的簡潔,如下:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"><title>Simple Form</title>
</head>
<body><form action="/submit" method="POST" enctype="multipart/form-data"><label>昵稱:</label><input type="text" name="nickname" required><br><label>圖片:</label><input type="file" name="image" accept="image/*" required><br><button type="submit">Submit</button></form>
</body>
</html>

我們來逐個介紹每一個關鍵元素的作用,首先就是 form 元素,用于定義用戶可以填寫并提交數據的表單。它負責收集用戶輸入并將數據發送到指定的服務器地址:

  • action:定義表單提交的目標地址,比如這里就表示提交到當前域名下的 /submit 路徑(對于處理表單數據的路徑)
  • method:提交表單時最常用的就是 POST 方式
  • enctype:定義表單數據的編碼類型,影響服務器解析數據的方式。常見值:
    • application/x-www-form-urlencoded(默認): 適合普通鍵值對數據(比如賬號和密碼)
    • multipart/form-data: 必須在表單 包含文件上傳 時使用
    • text/plain: 將數據以 純文本形式 發送,較少使用

現在我們在介紹 input 元素,來控制用戶的輸入:

  • type:我們這里使用了 text 代表普通文本輸入;以及 file 代表傳輸特定的文件(支持 accept 屬性限制文件類型)
  • name:定義該輸入框的名稱,用于在表單提交時標識字段,在后面可以根據特定的字段提取相應的數據
  • required:代表數據必須填寫,不可為空

這就是前端的邏輯,很多時候前端占據多數的都是樣式的調整,咋們直接抽絲剝繭來一個最基礎版的幫助大家理解。

2. 后端邏輯

?通過前端的邏輯我們得知,用戶會提交一個昵稱和一個圖片以 POST 的方式發送到 /submit 下進行處理。那我們怎么實現呢,我們使用一個 httplib 提供的接口,如下:

Server &Post(const std::string &pattern, Handler handler);
  • Post: 代表處理 Post 方式傳輸的數據
  • pattern:表示相應的處理路徑,這里我們就應該傳入 /submit
  • handler:定義為 using handler = std::function<void(const httplib& Requests, httplib::Response&)> 我們定義的處理函數,需要符合他的參數返回值

但是在使用之前,我們還需要學習一個知識點,那就是如何將表單里面的數據以取出來!
?大家記好了,我們表單當中的每一個數據都以 MultipartFormData 的形式存儲在 httplib& Requests 中,我們只需要每個數據的 命名 即可提取(咦?命名 怎么來的呀?如果你感到疑惑,請移步到 input 元素的 name 字段)。具體使用方式:

/*部分代碼*/
void HandlePost(const httplib::Request &req, httplib::Response &rsp) 
{/*這里是做嚴謹地檢查,是否存在該命名的數據*/if (req.has_file("nickname")) {/*提取表單中單個元素的數據*/httplib::MultipartFormData nickname = req.get_file_value("nickname");

其實這個類型就是一個結構體,存儲數據的相關信息:

struct MultipartFormData {std::string name;    /*數據的名稱*/std::string content; /*數據的內容*/std::string filename;/*文件的名稱(如果他是一個文件,否則空)*/std::string content_type;/*數據類型*/
};

咋們打印看一下上傳的圖片的文件信息,就不打印內容了是亂碼:

image/jpeg
AVL.jpg
image

現在基本的使用咋們理解了,那底層是咋一回事呢?


二、 HTTP 報文傳輸格式

?提供使用瀏覽器的網絡抓包,我們先來看一下傳輸的 請求頭 是怎么樣的:
在這里插入圖片描述
發現在數據類型后面多了一個字段 boundary(分界線)boundary 是客戶端(如瀏覽器)自動生成的,用來分隔 HTTP 請求體中的多個部分(因為表單當中有多個類型的數據需要間隔開)。
?現在我們看一下正文內容的存儲格式:
在這里插入圖片描述
兩個數據一個是文本一個是圖片(但是圖片的數據沒有正常顯示)。


總結

?HTML表單 是網頁中與用戶交互的重要元素,允許用戶輸入數據并將其發送到服務器進行處理。也許我們可以自己嘗試設計一下解析 multipart/form-data 報文請求的方法。紙上得來終覺淺,絕知此事要躬行!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/62396.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/62396.shtml
英文地址,請注明出處:http://en.pswp.cn/web/62396.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux下redis環境的搭建

1.redis的下載 redis官網下載redis的linux壓縮包&#xff0c;官網地址:Redis下載 網盤鏈接&#xff1a; 通過網盤分享的文件&#xff1a;redis-5.0.4.tar.gz 鏈接: https://pan.baidu.com/s/1cz3ifYrDcHWZXmT1fNzBrQ?pwdehgj 提取碼: ehgj 2.redis安裝與配置 將包上傳到 /…

如何使用靜態IP代理?【詳細教程】

靜態IP地址是手動分配給設備或伺服器的固定不變的 IP。與動態 IP 地址不同&#xff0c;動態 IP 地址由 DHCP 伺服器自動分配&#xff0c;並且會隨時間而變化。??????? 如何獲取和設置靜態IP地址 一、檢查是否需要靜態IP&#xff1f; 在配置靜態 IP 之前&#xff0c;請…

監控組態軟件的構成與功能

監控組態軟件的構成包括系統開發環境、圖形界面系統、實時數據庫系統等。其功能包括數據采集與控制、人機交互界面、數據處理與存儲等。 監控組態軟件的構成&#xff1a; 系統開發環境&#xff1a;這是自動化工程設計工程師為實施其控制方案&#xff0c;在組態軟件的支持下進行…

Java 基礎之 XQuery:強大的 XML 查詢語言

一、什么是 XQuery XQuery 是一種函數式語言&#xff0c;專門用于檢索以 XML 格式存儲的信息。它負責從 XML 文檔中查找和提取元素及屬性&#xff0c;在網絡服務中有著廣泛的應用&#xff0c;比如提取信息、生成摘要報告、進行數據轉換等。 XQuery 是 W3C 設計的一種針對于 X…

day09性能測試(1)——純理論

document.querySelector(video).playbackRate 2.5 //可以寫任何數字 【沒有所謂的運氣&#x1f36c;&#xff0c;只有絕對的努力?】 目錄 1、性能測試概念 2、功能測試 vs 性能測試 3、小結&#xff08;習題&#xff09; 4、性能測試的策略 4.1 基準測試 4.2 負載測試 …

docker-3.docker權限問題

docker權限,每次開機都要重新sudo 目錄 1.簡介2.解決辦法1:當前用戶添加到docker用戶組(這個方法還是缺權限??)3.解決辦法2:臨時更改Docker socket文件權限1.簡介 Ubuntu下Docker提示permission denied (權限不足)解決辦法 安裝docker后,執行docker ps命令時提示 perm…

easyExcel實現表頭批注

背景&#xff1a; 網上大部分都不能直接使用&#xff0c;為此總結一個方便入手且可用的工具&#xff0c;用自定義注解實現 依賴包&#xff1a; <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>…

內部類和Object類

匿名對象 格式&#xff1a; 匿名對象只可以調用一次成員 &#xff1a; 1. 調用一次成員變量 &#xff1a; new 類名(實參).成員變量名&#xff1b; 2.調用一次成員方法&#xff1a; new 類名(實參).成員方法名(實參)&#xff1b; 匿名對象存在的必要&#xff1a;為了提高…

Python的3D可視化庫vedo 1-3 (visual模塊)網格對象的線和面、圖片的屬性

文章目錄 4 MeshVisual4.1 線條4.1.1 線寬和顏色4.1.2 線條渲染為管 4.2 曲面4.2.1 物體展示為實心或框架4.2.2 曲面插值4.2.3 面的剔除 4.3 紋理4.4 相機跟隨 5 ImageVisual5.1 圖片屬性5.1.1 占用內存大小5.1.2 顏色標量范圍 5.2 渲染屬性5.2.1 透明度5.2.2 亮度5.2.3 對比度…

19 設計模式之享元模式(電影院座位預定案例)

一、享元模式的定義 享元模式是一種結構型設計模式&#xff0c;它通過共享對象來支持大量細粒度的對象&#xff0c;減少內存消耗。享元模式的核心思想是&#xff1a;將對象分為共享部分和非共享部分&#xff0c;只有共享部分是被多個對象共享的&#xff0c;而非共享部分則是每個…

使用redis 的stream 做消息中間件 多線程消費消息

1.redis stream 特點 1.支持消息持久化 2.消費者組模式 3.消息確認機制 4. 消息重試機制 5. 死信隊列2. 消息生產者服務 2.1 如下代碼Service Slf4j public class StreamMessageProducer {Autowiredprivate StringRedisTemplate redisTemplate;private static final String S…

Python100道練習題

Python100道練習題 BIlibili 1、兩數之和 num1 20 num2 22result num1 num2print(result)2、一百以內的偶數 list1 []for i in range(1,100):if i % 2 0:list1.append(i) print(list1)3、一百以內的奇數 # 方法一 list1 [] for i in range(1,100):if i % 2 ! 0:lis…

Java轉C之并發和多線程

提綱&#xff1a; 概念介紹與對比概述 簡述Java與C在并發和多線程方面的核心區別解釋C11標準、POSIX、C11 <threads.h>、Pthread等名詞 Java多線程與并發回顧 線程、Runnable、ExecutorService概念說明同步關鍵字與工具類含義 C并發基礎 沒有Java式的內置線程類&#xf…

Ubuntu系統本地化搭建Maxakb+Ollama

安裝docker 最詳細的ubuntu 安裝 docker教程-騰訊云開發者社區-騰訊云 安裝Ollama Ollama官網 執行命令&#xff1a; curl -fsSL https://ollama.com/install.sh | sh安裝完成后下載模型 執行命令&#xff1a; ollama run llama3.3:70b安裝MaxKb 執行命令&#xff1a; d…

基于JAVA的旅游網站系統設計

摘要 隨著信息技術和網絡技術的迅速發展&#xff0c;人們的生活質量和觀念也在發生著改變&#xff0c;各地爭相發展旅游業&#xff0c;傳統的 旅游社已經無法滿足人們的需求&#xff0c;旅游網站將突破傳統在時間和地域的限制&#xff0c;成為方便、快捷、安全、可靠的旅游 方…

【Flux.jl】 卷積神經網絡

Flux.jl 是包含卷積神經網絡的, 但是官方API文件中沒有給出一個完整的程序框架, 只是對所需神經元給了局部解釋, 此外對 model-zoo 模型動物園中的案例沒有及時跟著 Flux.jl 的版本更新, 也無法運行出來結果。 因此本文搭建了一個完整可訓練的卷積神經網絡。 Conv 卷積算子…

H5游戲出海如何獲得更多增長機會?

海外H5小游戲的崛起給了國內眾多中小廠商出海發展的機會&#xff0c;開發者如何在海外市場獲得更多的增長機會&#xff1f;#APP出海# H5游戲如何在海外獲得核心用戶&#xff1f; HTML5游戲的開發與運營者們首先可以利用量多質高的HTML5游戲&#xff0c;維持海外用戶粘性&…

Next.js系統性教學:深入理解和應用組件組合模式

更多有關Next.js教程&#xff0c;請查閱&#xff1a; 【目錄】Next.js 獨立開發系列教程-CSDN博客 目錄 更多有關Next.js教程&#xff0c;請查閱&#xff1a; 1. 什么是組件組合模式&#xff1f; 1.1 組件組合模式概述 1.2 組件組合模式的優勢 2. Next.js 中的組件組合模式…

國際薦酒師Peter助力第六屆地博會,推動地理標志產品國際化發展

國際薦酒師Peter Lisicky助力第六屆知交會暨地博會&#xff0c;推動地理標志產品國際化發展 第六屆粵港澳大灣區知識產權交易博覽會暨國際地理標志產品交易博覽會于2024年12月9日至11日在中新廣州知識城盛大舉行&#xff0c;吸引了全球眾多行業專家、企業代表及相關機構齊聚一…

Mybatis 延遲加載的實現原理詳細解析

Mybatis 延遲加載的實現原理詳細解析 &#xff08;1&#xff09;代理對象機制的深入探討 代理對象的生成&#xff1a;Mybatis 使用代理對象來實現延遲加載是基于 Java 的代理機制。當開啟延遲加載并且配置正確后&#xff0c;對于需要延遲加載的關聯對象&#xff0c;Mybatis 會…