Domanda

Sto cercando di caricare un file PNG attraverso Winsock2 HTTP Post. Ecco la mia stringa di richiesta:

boundary = "-----rueldotme";                                                                
request += "POST " + uri + " HTTP/1.1\r\n";                                     
request += "Host: " + hostname + "\r\n";
request += "User-Agent: " + UserAgent + "\r\n";
request += "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n";
request += "Accept-Language: en-us,en;q=0.5\r\n";
request += "Accept-Encoding: gzip,deflate\r\n";
request += "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n";
request += "Keep-Alive: 115\r\n";
request += "Connection: keep-alive\r\n";
request += "Content-Length: " + fileSize + "\r\n";
request += "Content-Type: multipart/form-data, boundary=" + boundary + "\r\n";
request += "\r\n";
request += "--" + boundary + "\r\n";
request += "Content-Disposition: form-data; name=\"filename\"; filename=\"" + fileName + "\"\r\n";
request += "Content-Type: image/png; charset=binary\r\n";
request += "Content-Transfer-Encoding: binary\r\n";
request += "\r\n";
request += "%s\r\n";
request += "\r\n";

La connessione è OK, nessun errore e tale, il fileCon tra l'altro è da ReadFile(). E non c'è nessun codice di errore. Il numero di byte di lettura è la stessa come l'uscita di GetFileSize(). Ho provato a mostrare il contenuto dei fileCon, ma mi ha dato solo questo:

alt text

Non mi dispiace il titolo " Errore " (ho impostato).

Inoltre, la richiesta prende le età per completare, e mi dà una risposta vuota. Yep, vuota, senza intestazioni HTTP. Sto facendo la richiesta giusta? Dovrei davvero a comprendere il contenuto del file i dati POST?

Grazie in anticipo.

Modifica : Il formato PNG è di circa 256KB. Sono in una connessione 1Mbps.

Modifica : Scusate se le informazioni erano insufficienti. Comunque, ecco quello che ho fatto ultimamente:

int flz;
char bdata[BSIZE];
DWORD dwe, bytesRead = 0;
HANDLE fh = CreateFile(fileName.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);  
LPVOID fbuff = NULL;
flz = GetFileSize(fh, NULL);
fbuff = malloc(flz);
ReadFile(fh, fbuff, flz, &bytesRead, NULL));

...

sprintf_s(bdata, BSIZE, request.c_str(), reinterpret_cast<char *>(fbuff)); //BSIZE = 1024

...

send(sock, bdata, std::strlen(bdata), 0);
È stato utile?

Soluzione

Non abbastanza informazioni per risolvere il problema, in modo da darò una meta-risposta, invece: Utilizzare una ventosa di pacchetto (ad esempio, wireshark ) per controllare quali dati effettivamente inviati e ricevuti. Questo vi permetterà di verificare che la richiesta è come dovrebbe essere, e che la "risposta vuota" che stai ricevendo davvero è vuoto.

Una pugnalata selvaggio nel buio: Non hai incluso eventuali dichiarazioni di variabili in snippet di codice, quindi non so che tipo "fileCon" è, ma non dimenticate che i dati PNG può contenere byte null, che pasticcio volontà di una conversione predefinita da un char* ad un std::string.

Modifica La vostra modifica contiene lo stesso bug che la versione basata std::string aveva, cioè, che i dati PNG può contenere byte nulli. Forse questo codice spiegherà più chiaramente:

const char* data = "Hello\0world."; // some data that contains a null byte
std::string dataStr(data);
std::cout << dataStr << "\n"; // will print "Hello".
std::cout << dataStr.size() << "\n"; // will print "5"
char buf[512];
sprintf_s(buf, sizeof(buf), "Data: %s\n", data);
std::cout << buf; // will print "Data: Hello"

Sia la conversione std::string e formattazione con sprintf interpreterà il byte null come la fine dei dati, e quindi non verrà mai utilizzato il resto dei dati originali ("world.").

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top