网站建设资讯

NEWS

网站建设资讯

向腾讯云服务器传文件格式 腾讯云服务器文件下载到本地

如何使用multipart/form-data格式上传文件

在网络编程过程中需要向服务器上传文件。Multipart/form-data是上传文件的一种方式。

创新互联建站坚持“要么做到,要么别承诺”的工作理念,服务领域包括:成都做网站、成都网站建设、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的康巴什网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!

Multipart/form-data其实就是浏览器用表单上传文件的方式。最常见的情境是:在写邮件时,向邮件后添加附件,附件通常使用表单添加,也就是用multipart/form-data格式上传到服务器。

表单形式上传附件

具体的步骤是怎样的呢?

首先,客户端和服务器建立连接(TCP协议)。

第二,客户端可以向服务器端发送数据。因为上传文件实质上也是向服务器端发送请求。

第三,客户端按照符合“multipart/form-data”的格式向服务器端发送数据。

既然Multipart/form-data格式就念败是浏览器用表单提交数据的格式,我们就来看看文件经过浏览器编码后是什么样子。

点击“Browse…”分别选择“unknow.gif”和“unknow1.gif”文件,点击“submit”按纽后,文件将被上传到服务器。

下面是服务器收到的数据:

服务器收到的数据

这是一个POST请求。所以数据是放在请求体内,而不是请求头内。

这行指出这个请求是“multipart/form-data”格式的,且“boundary”是 “---------------------------7db15a14291cce”这个行瞎字符串。

不难想象,“boundary”是用来隔开表单中不同部分数据的。例子中的表单就有 2 部分数据,用“boundary”隔开。“boundary”一般由系统随机产生,但也可以简单的用“-------------”来代替。

实际上,每部分数据的开头都是由"--"仔带颤 + boundary开始,而不是由 boundary 开始。仔细看才能发现下面的开头这段字符串实际上要比 boundary 多了个 “--”

紧接着 boundary 的是该部分数据的描述。

接下来才是数据。

“GIF”gif格式图片的文件头,可见,unknow1.gif确实是gif格式图片。

在请求的最后,则是 "--" + boundary + "--" 表明表单的结束。

需要注意的是,在html协议中,用 “\r\n” 换行,而不是 “\n”。

下面的代码片断演示如何构造multipart/form-data格式数据,并上传图片到服务器。

//---------------------------------------

// this is the demo code of using multipart/form-data to upload text and photos.

// -use WinInet APIs.

//

//

// connection handlers.

//

HRESULT hr;

HINTERNET m_hOpen;

HINTERNET m_hConnect;

HINTERNET m_hRequest;

//

// make connection.

//

...

//

// form the content.

//

std::wstring strBoundary = std::wstring(L"------------------");

std::wstring wstrHeader(L"Content-Type: multipart/form-data, boundary=");

wstrHeader += strBoundary;

HttpAddRequestHeaders(m_hRequest, wstrHeader.c_str(), DWORD(wstrHeader.size()), HTTP_ADDREQ_FLAG_ADD);

//

// "std::wstring strPhotoPath" is the name of photo to upload.

//

//

// uploaded photo form-part begin.

//

std::wstring strMultipartFirst(L"--");

strMultipartFirst += strBoundary;

strMultipartFirst += L"\r\nContent-Disposition: form-data; name=\"pic\"; filename=";

strMultipartFirst += L"\"" + strPhotoPath + L"\"";

strMultipartFirst += L"\r\nContent-Type: image/jpeg\r\n\r\n";

//

// "std::wstring strTextContent" is the text to uploaded.

//

//

// uploaded text form-part begin.

//

std::wstring strMultipartInter(L"\r\n--");

strMultipartInter += strBoundary;

strMultipartInter += L"\r\nContent-Disposition: form-data; name=\"status\"\r\n\r\n";

std::wstring wstrPostDataUrlEncode(CEncodeTool::Encode_Url(strTextContent));

// add text content to send.

strMultipartInter += wstrPostDataUrlEncode;

std::wstring strMultipartEnd(L"\r\n--");

strMultipartEnd += strBoundary;

strMultipartEnd += L"--\r\n";

//

// open photo file.

//

// ws2s(std::wstring)

// -transform "strPhotopath" from unicode to ansi.

std::ifstream *pstdofsPicInput = new std::ifstream;

pstdofsPicInput-open((ws2s(strPhotoPath)).c_str(), std::ios::binary|std::ios::in);

pstdofsPicInput-seekg(0, std::ios::end);

int nFileSize = pstdofsPicInput-tellg();

if(nPicFileLen == 0)

{

return E_ACCESSDENIED;

}

char *pchPicFileBuf = NULL;

try

{

pchPicFileBuf = new char[nPicFileLen];

}

catch(std::bad_alloc)

{

hr = E_FAIL;

}

if(FAILED(hr))

{

return hr;

}

pstdofsPicInput-seekg(0, std::ios::beg);

pstdofsPicInput-read(pchPicFileBuf, nPicFileLen);

if(pstdofsPicInput-bad())

{

pstdofsPicInput-close();

hr = E_FAIL;

}

delete pstdofsPicInput;

if(FAILED(hr))

{

return hr;

}

// Calculate the length of data to send.

std::string straMultipartFirst = CEncodeTool::ws2s(strMultipartFirst);

std::string straMultipartInter = CEncodeTool::ws2s(strMultipartInter);

std::string straMultipartEnd = CEncodeTool::ws2s(strMultipartEnd);

int cSendBufLen = straMultipartFirst.size() + nPicFileLen + straMultipartInter.size() + straMultipartEnd.size();

// Allocate the buffer to temporary store the data to send.

PCHAR pchSendBuf = new CHAR[cSendBufLen];

memcpy(pchSendBuf, straMultipartFirst.c_str(), straMultipartFirst.size());

memcpy(pchSendBuf + straMultipartFirst.size(), (const char *)pchPicFileBuf, nPicFileLen);

memcpy(pchSendBuf + straMultipartFirst.size() + nPicFileLen, straMultipartInter.c_str(), straMultipartInter.size());

memcpy(pchSendBuf + straMultipartFirst.size() + nPicFileLen + straMultipartInter.size(), straMultipartEnd.c_str(), straMultipartEnd.size());

//

// send the request data.

//

HttpSendRequest(m_hRequest, NULL, 0, (LPVOID)pchSendBuf, cSendBufLen)

腾讯云服务器如何把文件上传到服务器上?

一般可以通过scp命令,ftp服颂培务,野烂唯git仓库等多种方式向服务器传输文件

可以选择自己熟悉历清的方式上传

摄像机如何通过无线传输方式将拍摄的视频文件传云端?

可以基于支持无线视频流云端推送的WiFi模块来实现:

方案构成:无线视频流云端推送方案由USB摄像头,QCA9531 WiFi模块、云端视频服务器及接收视频的手机组成。

方案设计:在网络USB摄像头的PCB板上,嵌入QCA9531 WiFi模块,通过USB接口将摄像头连接到WiFi模块,WiFi模块将摄像头采集的视频传输上传到云端视频服务器,并提供视频播放地址,用户通过手机端访问播放地址即可实时播放视频。

工作原理:用户在云端架设好云端视频服务器,通过WiFi模块采集USB摄像头视频内容,并将视频数据上传到云端视频服务器;手机端通过访问云端视频服务器提供的播放地址,获取视频流,实时查看USB摄像头采集的视频。

硬件准备:一台电脑,一根网线,一个UVC免驱动摄像头,一块SKW99模块,一块SKW99 EVB板,DC适配器,两根WiFi模块天线

接线:摄像头通过USB连接蚂缓到WIFI模块,WIFI通过无线中继或WAN口或4G/5G模块上网将摄像头采集闷锋模的数据上传到服务器,下图是方案演示接线图,此处使用基粗无线中继上网,将摄像头采集的数据上传到服务器。

网页配置:申请云平台账号(支持主流云平台,本篇以腾讯云直播平台为例),开通云直播,注册推流域名,播放域名,并对域名进行备案和解析;

在腾讯云直播上创建推流地址,并在WIFI模块的对应界面配置相应信息,主要是摄像头参数信息和视频服务器信息;

使用VLC查看推流结果,若是使用腾讯云推流,则播放如图一:使用腾讯云推流后,配置播放地址后的配置,按上图的播放地址,在VLC的“网络”中输入上面的播放地址,如下图进行播放。

若是腾讯云直播服务器推流,可通过微信关注“腾讯云视频云”小程序,打开小程序按下图操作;

嵌入式RTMP/RTSP协议,可独立推流到流媒体服务器;

UVC免驱摄像头挂载,摄像头可支持H.264/MJPG/YUYV视频格式;

支持720P@30帧/130万像素,本地视频服支持1080P@30帧/200万像素;


新闻名称:向腾讯云服务器传文件格式 腾讯云服务器文件下载到本地
浏览路径:http://njwzjz.com/article/dspghjo.html