[HTTP上传]HTTP上传数据的问题

pisces007 2009-04-25 04:33:55
在使用VC编写HTTP上传、下载的时候,
遇到了几个问题,请大侠们帮忙解决下:
1)Post上传时,有报头和报文内容两部分。
其中报头包含要访问的页面:POST /download HTTP/1.1
报文中含有登陆的信息和文件流,这两个可以放在一起么??

2)Post上传时,有一个上传文件的类型,
如:Content-Type: text/xml
在VC中如何通过文件名判断出这个Type呢?

3)Post报文中的数据流,
可以使用fread读出的文件流嘛?需不需要特殊处理?

多谢大家
...全文
171 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Dobzhansky 2009-04-28
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 ok1234567 的回复:]
引用楼主 pisces007 的帖子:
在使用VC编写HTTP上传、下载的时候,
遇到了几个问题,请大侠们帮忙解决下:
1)Post上传时,有报头和报文内容两部分。
其中报头包含要访问的页面:POST /download HTTP/1.1
报文中含有登陆的信息和文件流,这两个可以放在一起么??

2)Post上传时,有一个上传文件的类型,
如:Content-Type: text/xml
在VC中如何通过文件名判断出这个Type呢?

3)Post报文中的数据流,
可以使用frea…
[/Quote]

嗯, 还要看看 MIME 规范.
ok1234567 2009-04-28
  • 打赏
  • 举报
回复
[Quote=引用楼主 pisces007 的帖子:]
在使用VC编写HTTP上传、下载的时候,
遇到了几个问题,请大侠们帮忙解决下:
1)Post上传时,有报头和报文内容两部分。
其中报头包含要访问的页面:POST /download HTTP/1.1
报文中含有登陆的信息和文件流,这两个可以放在一起么??

2)Post上传时,有一个上传文件的类型,
如:Content-Type: text/xml
在VC中如何通过文件名判断出这个Type呢?

3)Post报文中的数据流,
可以使用fread读出的文件流嘛?需…
[/Quote]

1、事实上必须放在一起传送(如果有附加报文),http是请求/响应模式,请求数据不完整收到,不会响应的
2、如果有文件,则报头中必须定义:Content-Type: multipart/form-data; boundary=xxxYYYYxxx
表文数据按照form-data规范封装,也就是用边界(boundary)分隔
3、上传的文件数据类型,你需要建立一个文件映射表,不同文件扩展名,标识不同的数据类型,这方面的资源可以在网上搜索一下。文件名、字符集、编码类型之类的都要定义

有一个简单的办法:使用sniffer,看看IE是怎么封装数据的,一切都会明白
biweilun 2009-04-25
  • 打赏
  • 举报
回复
现在上传都是这样传的,用WinInet

BOOL UseHttpSendReqEx(HINTERNET hConnect, TCHAR *upFile)
{
INTERNET_BUFFERS BufferIn = {0};
DWORD dwBytesRead;
DWORD dwBytesWritten;
BYTE pBuffer[1024]; // Read from file in 1K chunks
BOOL bRead, bRet;

BufferIn.dwStructSize = sizeof( INTERNET_BUFFERS );

HINTERNET hRequest = HttpOpenRequest (hConnect, "PUT",
"/test/page.htm", NULL, NULL, NULL, 0, 0);
if (!hRequest)
{
printf("Failed to open request handle: %lu\n", GetLastError ());
return FALSE;
}

HANDLE hFile = CreateFile (upFile, GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
printf("\nFailed to open local file %s.", upFile);
return FALSE;
}

BufferIn.dwBufferTotal = GetFileSize (hFile, NULL);
printf ("File size is %d\n", BufferIn.dwBufferTotal );

if(!HttpSendRequestEx( hRequest, &BufferIn, NULL, HSR_INITIATE, 0))
{
printf( "Error on HttpSendRequestEx %lu\n",GetLastError() );
return FALSE;
}

DWORD sum = 0;
do
{
if (!(bRead = ReadFile (hFile, pBuffer, sizeof(pBuffer),
&dwBytesRead, NULL)))
{
printf ("\nReadFile failed on buffer %lu.",GetLastError());
break;
}
if (!(bRet=InternetWriteFile( hRequest, pBuffer, dwBytesRead,
&dwBytesWritten)))
{
printf ("\nInternetWriteFile failed %lu", GetLastError());
break;
}
sum += dwBytesWritten;
}
while (dwBytesRead == sizeof(pBuffer)) ;

CloseHandle (hFile);
printf ("Actual written bytes: %d\n", sum);

if(!HttpEndRequest(hRequest, NULL, 0, 0))
{
printf( "Error on HttpEndRequest %lu \n", GetLastError());
return FALSE;
}
return TRUE;
}


biweilun 2009-04-25
  • 打赏
  • 举报
回复
文件判别么,用字符截取最后4个字符,判断下后缀就好了呀
fread自然是可以读的。
biweilun 2009-04-25
  • 打赏
  • 举报
回复
POST /download HTTP/1.1第一行,其他的信息往下写,本来就该“放一起”一起提交的。注意各行信息间加“\r\n”就好。
HTTP请求由三部分组成,分别是:
请求行,消息报头,请求正文。


请求行(格式):
Method Request-URI HTTP-Version CRLF

Method:方法。
GET 请求获取由Request-URI所标识的资源。
POST 在Request-URI所标识的资源后附加新的数据。
HEAD 请求获取由Request-URI所标识的资源的响应消息报头。
PUT 请求服务器存储一个资源,并用Request-URI作为其标识。
DELETE 请求服务器删除由Request-URI所标识的资源。
TRACE 请求服务器回送收到的请求信息,主要用语测试或诊断。
CONNECT 保留将来使用。
OPTIONS 请求查询服务器的性能,或查询与资源相关的选项和需求。

Request-URI:统一资源标识。

HTTP-Version:HTTP的版本。

CRLF:回车换行。(\r\n)

blackcat242 2009-04-25
  • 打赏
  • 举报
回复
上传文件都是二进制的,没有用文本吧
可以用fread读出来,注意编码问题
一、项目简介 本项目教程以国内电商巨头实际业务应用场景为依托,同时以阿里云ECS服务器为技术支持,紧跟大数据主流场景,对接企业实际需求,对电商数仓的常见实战指标进行了详尽讲解,让你迅速成长,获取最前沿的技术经验。 二、项目架构 版本框架:Flume、DateHub、DataWorks、MaxCompute、MySql以及QuickBI等; Flume:大数据领域被广泛运用的日志采集框架; DateHub:类似于传统大数据解决方案中Kafka的角色,提供了一个数据队列功能。对于离线计算,DataHub除了供了一个缓冲的队列作用。同时由于DataHub提供了各种与其他阿里云上下游产品的对接功能,所以DataHub又扮演了一个数据的分发枢纽工作; 据上传和下载通道,提供SQL及MapReduce等多种计算分析服务,同时还提供完善的安全解决方案; DataWorks:是基于MaxCompute计算引擎,从工作室、车间到工具集都齐备的一站式大数据工厂,它能帮助你快速完成数据集成、开发、治理、服务、质量、安全等全套数据研发工作; QuickBI & DataV:专为云上用户量身打造的新一代智能BI服务平台。 三、项目场景 数仓项目广泛应用于大数据领域,该项目技术可以高度适配电商、金融、医疗、在线教育、传媒、电信、交通等各领域; 四、项目特色 本课程结合国内多家企业实际项目经验。从集群规模的确定到框架版本选型以及服务器选型,手把手教你从零开始搭建基于阿里云服务器的大数据集群。采用阿里云ECS服务器作为数据平台,搭建高可用的、高可靠的Flume数据采集通道,运用阿里云DateHub构建中间缓冲队列并担任数据分发枢纽将数据推送至阿里自主研发的DataWorks对数据进行分层处理,采用MaxCompute作为处理海量数据的方案,将计算结果保存至MySQL并结合阿里的QuickBI工作做最终数据展示。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧