Witam
Mam pewien problem odnośnie wysyłania plików na serwer. Kiedy wysyłam małe pliki, np 10kb, 170kb itd. to nie ma żadnego problemu. Jednak przy próbie wysłania pliku 1MB pojawia się pewien problem. Plik nie jest wysyłany w całości. Np wysyłane jest 477kb zamiast 1MB.
int http_upload(string hostname, string filename, string localfile, string localfilename){
//hostname - nazwa hosta www, filename - adres do pliku php na serwerze, localfile - plik do wyslania, localfilename - nazwa pliku jaka zostanie przeslana do serwera
struct hostent *he;
he=gethostbyname(hostname.c_str());
int sockfd;
struct sockaddr_in my_addr;
sockfd = socket(PF_INET, SOCK_STREAM, 0);
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(80); // short, network byte order
my_addr.sin_addr.s_addr = inet_addr(inet_ntoa( *((struct in_addr *)he->h_addr)));
memset(my_addr.sin_zero, '\0', sizeof my_addr.sin_zero);
if( connect( sockfd,( struct sockaddr * ) & my_addr, sizeof( struct sockaddr ) ) == -1 ){
return 1; //blad poleczenia
}
string sendbufx;
string content;
content.append("--186502128026226\r\n");
content.append("Content-Disposition: form-data; name=\"file\"; filename=\"");
content.append(localfilename);
content.append("\"\r\n");
content.append("Content-Type: application/octet-stream\r\n\r\n");
string content_end;
content_end.append("\r\n--186502128026226--\r\n");
int file_len;
fstream plik;
plik.open(localfile.c_str(), ios_base::in | ios_base::binary);
if(plik.good()){
plik.seekg(0,plik.end);
file_len = plik.tellg(); //pobierz wielkosc pliku
plik.seekg(0,plik.beg);
int total_len = content.length() + file_len + content_end.length();
cout << "File len: " << file_len << " | Total len: " << total_len << endl;
char stringtosend_size[16];
sprintf(stringtosend_size,"%d",total_len);
sendbufx.append("POST ");
sendbufx.append(filename.c_str());
sendbufx.append(" HTTP/1.1\r\nHost: ");
sendbufx.append(hostname.c_str());
sendbufx.append("\r\nAccept-Language: en-us\r\nContent-Length: ");
sendbufx.append(stringtosend_size);
sendbufx.append("\r\nContent-Type: multipart/form-data; boundary=186502128026226\r\n\r\n");
sendall(sockfd,sendbufx.c_str(),sendbufx.size());
sendall(sockfd,content.c_str(),content.size());
char buf[2048];
int readed = 0;
while(!plik.eof()){
plik.read(buf,2048);
readed=plik.gcount();
sendall(sockfd,buf,readed);
}
sendall(sockfd,content_end.c_str(),content_end.size());
plik.close();
string ret;
ret=recvall(sockfd,false);
cout << ret << endl;
} else {
closesocket(sockfd);
return 2; //blad otwarcia pliku
}
closesocket(sockfd);
return 0;
}
Jeszcze kod funkcji sendall(z beej's guide):
int sendall(int s, const char *buf, int len)
{
int total = 0; // how many bytes we've sent
int bytesleft = len; // how many we have left to send
int n;
while(total < len) {
n = send(s, buf+total, bytesleft, 0);
if (n == -1) { break; }
total += n;
bytesleft -= n;
}
len = total; // return number actually sent here
return n==-1?-1:0; // return -1 on failure, 0 on success
}
Prosiłbym o pomoc, z góry bardzo dziękuję :)