Wysyłanie pliku na serwer www (multipart/form-data)

0

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ę :)

0

Okazało się iż był mały problem - próbowałem przesłać plik aplikacji skompilowany w codeblocks w trybie "debug" :) No i serwer napotykał na linie zakończenia wysyłania i przerywał. Funkcja okazało się działa - temat do zamknięcia :) Jak zawsze - szuka się problemów w kodzie i po stronie serwera, a popełniało się taki głupi błąd :D

1 użytkowników online, w tym zalogowanych: 0, gości: 1