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问题的主要内容,如果未能解决你的问题,请参考以下文章

在delphi上使用WININET上传文件

使用 Wininet 上传文件时如何添加正确的 Content-Type? (HTTP 放置)

尝试使用 wininet 将文件上传到 FTP 时遇到问题 [Id 返回 1 退出状态]

C++ 使用 WinINet 上传到 FTP 服务器

将进度条添加到wininet http上传C++

将文件发送到 HTTP 服务器(C++ Wininet)