der Einsatz von c++ zum senden einer Datei per http-POST
#include <winsock2.h>
#include <windows.h>
#include <iostream>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
int main (){
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0) {
cout << "WSAStartup failed.\n";
system("pause");
return 1;
}
SOCKET Socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
struct hostent *host;
host = gethostbyname("127.0.0.1");
SOCKADDR_IN SockAddr;
SockAddr.sin_port=htons(80);
SockAddr.sin_family=AF_INET;
SockAddr.sin_addr.s_addr = *((unsigned long*)host->h_addr);
cout << "Connecting...\n";
if(connect(Socket,(SOCKADDR*)(&SockAddr),sizeof(SockAddr)) != 0){
cout << "Could not connect";
system("pause");
return 1;
}
cout << "Connected.\n";
char header[]="POST /xampp/tests/file/check.php HTTP/1.1\r\n"
"Host: 127.0.0.1\r\n"
"Content-Type: application/x-www-form-urlencoded\r\n"
"Content-Length: 10\r\n"
"Connection: close\r\n"
"\r\n"
"text1=sase";
send(Socket,header, strlen(header),0);
char buffer[100000];
int nDataLength;
while ((nDataLength = recv(Socket,buffer,100000,0)) > 0){
int i = 0;
while (buffer[i] >= 32 || buffer[i] == '\n' || buffer[i] == '\r') {
cout << buffer[i];
i += 1;
}
}
closesocket(Socket);
WSACleanup();
cout<<endl<<endl;
system("pause");
return 0;
}
Dies ist mein Aktueller code. Es sendet text1, aber jetzt will ich es so senden Sie eine Datei (befindet sich in: C:\Users\Wade\Downloads\Documents) zusammen mit ihm. Wie mache ich das
wie sende ich eine Datei vom Benutzer an einem server unter Verwendung von HTTP POST-Protokoll
- Wenn Sie es geschafft, einen text zu versenden, was ist stoppen Sie von der Umwandlung der Datei, um text (im binären Modus) und senden Sie es die gleiche Weise? Ich meine - Sie haben bereits getan, der schwierige Teil, jetzt ist es Zeit zu tun, die standard-Dinge - Lesen von Dateien.
- Irgendeinem Grund Sie nicht mit libcurl, curl.haxx.se. Es ist entworfen, um zu tun genau das, was Sie wollen, und ist ein sehr robustes, ausgereiftes Produkt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
application/x-www-form-urlencoded
unterstützt nurname=value
Paare. ZuPOST
eine Datei, müssen Sie entweder:Verwenden
multipart/form-data
statt.Senden Sie den Inhalt der Datei selbst als die gesamte
POST
Inhalt, stellen dieContent-Type
dem tatsächlichen Typ der Datei oderapplication/octet-stream
, und legen Sie dieContent-Length
auf die Größe der Datei.Welche Sie verwenden, hängt davon ab, was der server ist in der Lage, zu akzeptieren.
CreateFile()
oderfopen()
) und loop es durch das Lesen seiner Daten (ReadFile()
oderfread()
) in einem fixed-size-buffer, die Siesend()
auf jeder loop-iteration, bis EOF. OderTransmitFile()
.multipart/form-data
nicht über eineContent-Length
war, dass am Zielmultipart/...
- Typen sind definiert durch den MIME und MIME sich nicht aufContent-Length
. Daten ist begrenzt durch eindeutige grenzmarkierungen statt.verwenden Sie diese codes
Ich gehe es an die Arbeit. hier ist der code ohne Lesen der Datei.
Content-Length
mitmultipart/form-data
, und diefilename
- Attribut sollte nicht mit Pfadinformationen enthalten, wird nur der Dateiname. In jedem Fall bedeutet dies nicht die Antwort auf Ihre ursprüngliche Frage, weil Sie ausdrücklich gebeten, so senden Sie eine Datei aus dem Benutzer-Dateisystem, und dieser code ist nicht zu tun.