[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读出的文件流嘛?需不需要特殊处理?

多谢大家
...全文
182 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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读出来,注意编码问题

18,363

社区成员

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

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