El caso que he probado de todas las maneras posibles sin éxito alguno, he probado a hacer POST enviando en una variable el nombre del archivo y en otra el contenido del archivo con application/x-www-form-urlencoded y recibía el nombre correctamente pero el contenido mal (los bytes del jpg), me conseguía crear el archivo en el servidor pero estaba corrupto, en el PHP simplemente habría el archivo con ese nombre y escribía el contenido en binario, pero ya os digo el archivo ocupaba 80kb y escribió solo 1,9kbs si no mal recuerdo.
También probé a usar lo mismo pero con application/octet-stream, y bueno en este caso tenía que cambiar el script PHP, pero no me interesó realmente y no le dí muchas vueltas a este método, porque quiero subirlo o bien con POST con application/x-www-form-urlencoded o con POST con multipart/form-data.
Visto que el primero escribía el 2% del archivo como que lo dejé y pase a multipart/form-data.
Copiando os datos de firefox, analizando paquetes de firefox con los de mi aplicación, como suben ambos el archivo, y SON JODIDAMENTE IGUALES EL BODY SOLO OJO, pero uno lo sube y otro no.
Os dejo el código de la función que sube un archivo y del PHP.
Código
<?php if($_FILES["archivo"]["name"]){ if ($_FILES["archivo"]["error"] > 0) { echo $_FILES["archivo"]["error"] . "<br/>"; } else { echo $_FILES["archivo"]["name"] . " ya existe. "; } else { "" . $_FILES["archivo"]["name"]); echo "Archivo Subido <br />"; } } } ?>
Código
bool tracker::SendFile(std::string _path) { HINTERNET hInternet; if ((hInternet = InternetOpenA(NULL, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0)) == NO_ERROR){ return false; } if ((hInternet = InternetConnectA(hInternet, domain.c_str(), INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0)) == NO_ERROR){ InternetCloseHandle(hInternet); return false; } DWORD requestFlags = INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP | INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS | INTERNET_FLAG_KEEP_CONNECTION | INTERNET_FLAG_NO_AUTO_REDIRECT | INTERNET_FLAG_NO_COOKIES | INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_NO_UI | INTERNET_FLAG_RELOAD; if ((hInternet = HttpOpenRequestA(hInternet, "POST", "/catcher.php", "HTTP/1.1", NULL, NULL, requestFlags, 0)) == NO_ERROR){ InternetCloseHandle(hInternet); return false; } std::ifstream reader("C:\\Users\\User\\Desktop\\ciclista.jpg", std::ifstream::ate | std::ifstream::binary); int size = reader.tellg(); char* buffer = new char[size]; reader.seekg(0, std::ios::beg); reader.read(buffer, size); reader.close(); std::string content; content = std::string(buffer, size); delete[] buffer; std::string body; std::string boundary = "-----------------------------268991947030948"; /*Body*/ body += boundary + "\r\n"; body += "Content-Disposition: form-data; name=\"archivo\"; filename=\"ciclista.jpg\"\r\n"; body += "Content-Type: image/jpeg\r\n\r\n"; body += content + "\r\n"; body += boundary + "\r\n"; body += "Content-Disposition: form-data; name=\"boton\"\r\n\r\n"; body += "Enviar archivo\r\n"; body += boundary + "--\r\n"; /*Header*/ std::string headers = "Content-Type: multipart/form-data; boundary=" + boundary + "\r\n"; HttpAddRequestHeadersA(hInternet, headers.c_str(), headers.length(), HTTP_ADDREQ_FLAG_ADD); /*Body*/ std::cout << body.substr(0, 600) << body.substr(body.length() - 200, 200); std::cout << body.length() << std::endl; if (HttpSendRequestA(hInternet, NULL, 0, (LPVOID)body.c_str(), body.length()) == NO_ERROR){ InternetCloseHandle(hInternet); return false; } std::string response; DWORD dwBytes; char ch; while (InternetReadFile(hInternet, &ch, 1, &dwBytes)) { if (dwBytes != 1) break; response += ch; } InternetCloseHandle(hInternet); std::cout << response; }
Bueno me he vuelto loco comparando el contenido de los paquetes, y solo puede fallar la cabecera (luego a saber que será), pero el Content-Length es igual en firefox que en mi función, luego si cambia algo sería la cabecera que tiene HOST, CONTENT-LENGTH, CONTENT-TYPE, CONNECTION KEEP ALIVE, CACHE-CONTROL NO CACHE. Al acabar el header \r\n\r\n como siempre y mando el body, ahí está el código, cuando recibo la respuesta del server recibo solo el HTML sin el "se ha subido correctamente" o "ya existe". Pero no hay errores en el PHP.
¿Qué pasa?.
Saludos :X