Hay otros métodos como PUT pero no me interesan. Quiero enviarlo por POST que funciona para todo tipo de archivos. La idea es que al subirlo envio 2 variables, una con el nombre del archivo y su extensión y otra con el contenido del archivo en binario. Quizás pueda tener que ver con el fallo.
Ojo, solo quiero subir todos los bytes del archivo y su nombre en 2 variables (nombre y contenido), y con el script PHP guardarlo. La idea sería poner cifrado a los bytes del archivo y desencriptarlo en el PHP, pero eso ya más adelante. Pero por eso necesito enviar el archivo en una variable como un array de bytes.
Código
//_path C:\\Users\\User\\Desktop\\bicieta.jpg bool tracker::send_file(std::string _path) { WSADATA wsa; SOCKET sock; sockaddr_in addr; std::string data; std::string peticion; WSAStartup(MAKEWORD(2, 0), &wsa); if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == SOCKET_ERROR){ WSACleanup(); return CODIGO::ERR_RED; } memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(IPPORT_HTTP); addr.sin_addr.s_addr = inet_addr("71.60.170.21");//ip domain = "web.com";//quitar std::ifstream filer(_path, std::ifstream::ate | std::ifstream::binary); int size = filer.tellg(); char* buffer = new char[size]; filer.seekg(0, std::ios::beg); filer.read(buffer, size); filer.close(); char aux[8]; int len; data = "n=" + _path.substr(_path.find_last_of('\\') + 1) + "&c="; len = data.size(); data += std::string(buffer, size); len = len + size; _itoa(len, aux, 10); peticion += "POST /catcher.php HTTP/1.1\r\n"; peticion += "Host: " + domain + "\r\n"; //peticion += "Cookie: " + cookie + "\r\n"; peticion += "Content-type: application/octet-stream\r\n";//multipart/form-data también he probado.. peticion += "Content-length: " + std::string(aux);// data.length(); peticion += "\r\n\r\n"; peticion += data; if (connect(sock, (struct sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR){ closesocket(sock); WSACleanup(); return CODIGO::ERR_RED; } if (send(sock, peticion.c_str(), peticion.length(), 0) == SOCKET_ERROR){ closesocket(sock); WSACleanup(); return CODIGO::ERR_RED; } char respuesta[1024]; memset(respuesta, 0, sizeof(respuesta)); if (recv(sock, respuesta, 1024, 0) == SOCKET_ERROR){ closesocket(sock); WSACleanup(); return CODIGO::ERR_RED; } return CODIGO::CORRECTO; }
Código
<? ?>
Bueno el cliente funciona sin problemas, sin embargo el php me dice que la variable "c" esta vacía. "empty". Luego la función salta error, pero no entiendo porque cuando le estoy enviando el contenido a la variable "c".
Edito: Y sí el código no es de lo mejorcito estoy de pruebas xd, hay chapuzillas y faltan cosas para que quede la función como tal.
Un saludo y gracias.
Edito: Bueno lo acabo de enviar como application/octet-stream y me daba error de que el filename estaba vacio que no se porque, de todas maneras lo elimine y dije que el server pusiera el nombre y solo mandar el contenido de la imagen, y se ha subido con éxito solo que al ver la imagen me dice que hay error y no me deja verla :""D.. bueno quizas no lo habra porque tiene 0 bytes.. por lo mismo que me daba error de que el nombre estaba vacio, la variable del contenido también esta vacia, quizás sea por el htmlgetspecialchars.
Lo suyo sería hacerlo con el boundary.. pero no entiendo porque de esta manera no deja. Solo quiero mandar los bytes en una variable cifrados y que al llegar los desencripte y los meta en un archivo.
Bueno continuando un poco la mejor manera creo que es enviandolo con el application/x-www-form-urlencoded, recibe la variable del nombre correctamente y el contenido a medias 1,900kb cuando el archivo es de 80kb, así que luego al abrir la foto me dice que no la puede mostrar. Creo que es el htmlgetspecialchars que lo corta al encontrar un caracter o algo porque los 80kb se mandan por wireshark. Sin el specialshars se corta en el 1,6kb XD.
Habrá un caracter nulo que corte el array o algo .
Seguramente haya que usar octet-stream pero en el PHP me aparecen nulas cuando las mando con ese formato.