上一篇文章讲到 http 的 MIME 类型http MIME 类型里有一个 multipart 多部分对象集合类型,这个类型 http 指南里有讲到:MIME 中的 multipart(多部分)电子邮件报文中包含多个报文,它们合在一起作为单一的复杂报文发送。每一部分都是独立的,有各自的描述及内容的集;不同的部分之间用分界字符串连接在一起。HTTP 也支持多部分主体,不过,通常只用在下列两种情形之一:提交填写好的表格,或是作为承载若干文档片段的范围响应。
前端技术不懂,这里只用 postman 用为客户端来做示例。表格和文档形式,是不是像这样的呢?
当你选中其中一种情形时,http 的 Headers 里就会多出一个 Content-Type 表明这是一个多部分集合的类型报文:
表格情形还没试验过,这里主要讲文档情形的。所以呢,用客户端 postman可以向服务端发送大的或是小的文档。下面给出服务端的例子:
#include #include #include #include #include #include
如果想要直接编译则需要把头文件#include “../logFormatPrt/log.h” 去掉,编译选项还得加上-lssl -lcrypto,Makefile 如下:
#中间文件存放目录,如.o 和 .d 文件COMPILE_DIR = compileBIN_DIR = bin# 可编译arm版本#CROSS = arm-himix200-linux-CC = gcc -m32CPP = $(CROSS)g++ -std=c++11 -m32CFLAGS = -Werror -gLIB = -lpthread -lssl -lcrypto#CPP_SRCS = $(wildcard *.cpp)CPP_SRCS = $(shell ls -t | grep "\.cpp$$" | head -1)CPP_OBJS = $(patsubst %.cpp, $(COMPILE_DIR)/%.o, $(CPP_SRCS))CPP_DEP = $(patsubst %.cpp, $(COMPILE_DIR)/%.cpp.d, $(CPP_SRCS))C_SRCS = mongoose.cC_OBJS = $(patsubst %.c, $(COMPILE_DIR)/%.o, $(C_SRCS))C_DEP = $(patsubst %.c, $(COMPILE_DIR)/%.c.d, $(C_SRCS))OBJS = $(CPP_OBJS) $(C_OBJS)DEP_ALL = $(CPP_DEP) $(C_DEP)$(shell if [ ! -d $(COMPILE_DIR) ]; then mkdir $(COMPILE_DIR); fi)$(shell if [ ! -d $(BIN_DIR) ]; then mkdir $(BIN_DIR); fi)BIN =ifeq ($(target), ) #如果是空的BIN = a.outelseBIN := $(target)endifTARGET=$(BIN_DIR)/$(BIN)all: $(TARGET)-include $(DEP_ALL)$(TARGET): $(OBJS)$(CPP) $(CFLAGS) $^ -o $@ $(LIB)$(COMPILE_DIR)/%.o: %.cpp $(COMPILE_DIR)/%.cpp.d$(CPP) $(CFLAGS) -c $< -o $@$(COMPILE_DIR)/%.cpp.d: %.cpp$(CPP) $(CFLAGS) -MM -E -c $ $@.tmp@mv $@.tmp $@$(COMPILE_DIR)/%.o: %.c $(COMPILE_DIR)/%.c.d$(CC) $(CFLAGS) -c $< -o $@$(COMPILE_DIR)/%.c.d: %.c$(CC) $(CFLAGS) -MM -E -c $ $@.tmp@mv $@.tmp $@.PHONY: cleanclean:rm -rf $(COMPILE_DIR) $(BIN_DIR)
大到一个G的文件,上传也是没有问题的,1.3G 的文件:
如果问我客户端怎么写,这个我是不会的,但 postman 里有个“代码片段”选项,可以翻译成不同的编码语言的代码:
而在 Mongoose.c 源码里,是这样处理 multipart 类型的报文的,判断头部字段 Content-Type 为 multipart 时,交由相关处理函数进行处理,然后就 return 了,不再后续处理了。