Wininet上传文件TCHAR问题
Posted
技术标签:
【中文标题】Wininet上传文件TCHAR问题【英文标题】:Wininet upload file TCHAR problems 【发布时间】:2014-03-14 08:48:46 【问题描述】:Dev C++ Wininet Upload file using HTTP 这里是 wininet 的例子。 我已经改了,但我不能让它工作!首先有警告说 char 函数与 TCHAR 变量一起使用。我已经用正确的函数替换了这些函数。
#include <windows.h>
#include <wininet.h>
#include <tchar.h>
#include <iostream>
#include "stdafx.h"
#include <windows.h>
#include <wininet.h>
#include <tchar.h>
#include <iostream>
#pragma comment(lib,"wininet.lib")
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
static TCHAR frmdata[] = L"-----------------------------7d82751e2bc0858\r\nContent-Disposition: form-data; name=\"file\"; filename=\"C:\\test.txt\"\r\nContent-Type: text/plain\r\n\r\nAAAAAAAAAAAAAAAAA\r\n-----------------------------7d82751e2bc0858--\r\n";
static TCHAR hdrs[] = L"Content-Type: multipart/form-data; boundary=---------------------------7d82751e2bc0858";
HINTERNET hSession = InternetOpen(L"MyAgent",INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
if(hSession==NULL)
cout<<"Error: InternetOpen";
HINTERNET hConnect = InternetConnect(hSession, L"localhost",INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1);
if(hConnect==NULL)
cout<<"Error: InternetConnect";
HINTERNET hRequest = HttpOpenRequest(hConnect, L"POST",L"/upload/upload.php", NULL, NULL, (LPCWSTR *)"*/*\0", 0, 1);
if(hRequest==NULL)
cout<<"Error: HttpOpenRequest";
BOOL sent= HttpSendRequest(hRequest, hdrs, wcslen(hdrs), frmdata, wcslen(frmdata));
if(!sent)
cout<<"Error: HttpSendRequest";
//close any valid internet-handles
InternetCloseHandle(hSession);
InternetCloseHandle(hConnect);
InternetCloseHandle(hRequest);
[/代码]
但它仍然无法正常工作!这就是我用netcat得到的
connect to [127.0.0.1] from validation.sls.microsoft.com [127.0.0.1] 52503
POST /upload/upload.php HTTP/1.1
Content-Type: multipart/form-data; boundary=---------------------------7d82751e
bc0858
User-Agent: MyAgent
Host: 127.0.0.1
Content-Length: 210
Cache-Control: no-cache
Cookie: s_pers=%20s_fid%3D6D463DCA024AF939-1C2604BDB2B68135%7C1457266833122%3B%
0s_vs%3D1%7C1394110233124%3B%20s_nr%3D1394108433125-Repeat%7C1425644433125%3B
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - 7 d 8 2 7 5 1 e 2 b c
8 5 8
C o n t e n t - D i s p o s i t i o n : f o r m - d a t a ; n a m e = " f
l e " ; f i l e n a m e = " C : \ t
我只是不明白为什么会这样。我已经改变了这个字符串
sent= HttpSendRequest(hRequest, hdrs, wcslen(hdrs), frmdata, wcslen(frmdata)*sizeof(TCHAR) );
并再次使用 ncat 捕获数据包。它看起来像这样:
connect to [127.0.0.1] from validation.sls.microsoft.com [127.0.0.1] 52570
POST /upload/upload.php HTTP/1.1
Content-Type: multipart/form-data; boundary=---------------------------7d82751e2
bc0858
User-Agent: MyAgent
Host: 127.0.0.1
Content-Length: 420
Cache-Control: no-cache
Cookie: s_pers=%20s_fid%3D6D463DCA024AF939-1C2604BDB2B68135%7C1457266833122%3B%2
0s_vs%3D1%7C1394110233124%3B%20s_nr%3D1394108433125-Repeat%7C1425644433125%3B
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - 7 d 8 2 7 5 1 e 2 b c
8 5 8
C o n t e n t - D i s p o s i t i o n : f o r m - d a t a ; n a m e = " f i
l e " ; f i l e n a m e = " C : \ t e s t . t x t "
C o n t e n t - T y p e : t e x t / p l a i n
A A A A A A A A A A A A A A A A A
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - 7 d 8 2 7 5 1 e 2 b c
0 8 5 8 - -
但还是有问题,因为我无法在 upload.php 脚本中上传数据(它是 100% 工作脚本,我用随机文件检查过它)。另外 netcat 中的数据看起来很奇怪,为什么字符之间有空格?也许是因为 TCHAR 数据?所以我还是很困惑。如何让它发挥作用?我认为这个问题出在 TCHAR 类型上,但必须有办法让它适用于任何类型。请帮忙。也对不起我的英语,它不是我的母语。所有帮助将不胜感激!
【问题讨论】:
TCHAR 无论如何都已经过时了,除非出于某种原因您的目标是 Windows 2000 之前的版本,否则它是不必要的。启用 Unicode 并使用 WCHAR。 我试过了,什么都没有。另外,TCHAR 不是在 unicode 激活时使用 wchar_t 的宏吗? 【参考方案1】:对于HttpSendRequest
调用,LPVOID lpOptional
不应为 unicode。
试试这个:
char pszData[] = "-----------------------------7d82751e2bc0858\r\nContent-Disposition: form-data; name=\"file\"; filename=\"C:\\test.txt\"\r\nContent-Type: text/plain\r\n\r\nAAAAAAAAAAAAAAAAA\r\n-----------------------------7d82751e2bc0858--\r\n";
BOOL sent= HttpSendRequest(hRequest, hdrs, wcslen(hdrs), pszData, strlen(pszData));
【讨论】:
以上是关于Wininet上传文件TCHAR问题的主要内容,如果未能解决你的问题,请参考以下文章
使用 Wininet 上传文件时如何添加正确的 Content-Type? (HTTP 放置)