получение файлов через HTTP сообщение в Java: файлы повреждены - PullRequest
0 голосов
/ 19 июля 2011

Я только что написал HTTP-сервер, который получает запрос POST через HTTP.В частности, он получает запросы в виде составных данных:

POST / HTTP/1.1
Host: 192.168.7.4:5000
User-Agent: Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Connection: keep-alive
Content-Type: multipart/form-data; boundary=---------------------------197987737412371961922053527775
Content-Length: 4306786


-----------------------------197987737412371961922053527775
Content-Disposition: form-data; name="filename"

poison.mp3
-----------------------------197987737412371961922053527775
Content-Disposition: form-data; name="prova"

provaV
-----------------------------197987737412371961922053527775
Content-Disposition: form-data; name="datafile"; filename="01-Poison.mp3"
Content-Type: audio/mpeg

file......

После заголовка каждый вход записывается в виде:

----------------------------- 197987737412371961922053527775 Conten_disposition ... \ r \ n \ r \ n "входной контент"

Последний содержит файл в двоичном виде.

Это мой Сервер, который сначала собирает всю информацию, содержащуюся в заголовке, а затем пытается восстановить файл.Если я отправляю запрос с моих локальных компьютеров, он работает нормально, но если я пытаюсь отправить файл с удаленного клиента, он повреждает файл.Я использую простой InputStream, открытый непосредственно из сокета.

Это метод, который пытается создать отправленный файл:

private void payloadFileCreation(InputStream in,boolean t1, FileOutputStream fos, long filesize ) throws IOException{

    int dyn_data_index=0;
    int chunk=2048;
    byte[] dyn_data = new byte[chunk];
    int av = in.available();
    while (filesize>chunk){
           in.read(dyn_data,0,chunk);
           fos.write(dyn_data,0,chunk);
       fos.flush();
       filesize -= chunk;

    }
    in.read(dyn_data,0,(int) filesize );
    fos.write(dyn_data,0, (int) filesize);
    fos.flush();
    fos.close();

    }

Есть идеи?Спасибо

1 Ответ

3 голосов
/ 19 июля 2011

Вы можете использовать Apache Commons FileUpload для анализа запросов из нескольких частей.

...