Загрузка файлов по протоколу HTTP через сокет Java - PullRequest
0 голосов
/ 05 октября 2018

Я пытаюсь понять, как работает протокол HTTP, поэтому я попытался вручную добавить заголовки в java Socket для отправки запроса на httpbin.org, как показано ниже:

        BufferedWriter wr = new BufferedWriter(/*socket Outputstream*/)     
        wr.write("POST post HTTP/1.1\r\n");
        wr.write("Host: httpbin.org\r\n");
        wr.write("Accept: */*\r\n");
        wr.write("Content-Length: "+data.length()+"\r\n");
        wr.write("Content-Type: multipart/form-data; boundary=---WebKitFormBoundary67\r\n");
        wr.write("\r\n"); 
        wr.write(data); 
        wr.flush();

В приведенном выше коде dataполезная нагрузка HTTP-запроса выглядит точно так, как показано ниже:

   ---WebKitFormBoundary67
   Content-Disposition: form-data; name="field1"
   value1
   ---WebKitFormBoundary67
   Content-Disposition: form-data; name="field2"; filename="example.txt"

   Java is better when it run long
   ---WebKitFormBoundary67--

Но сервер httpbin.org не определяет прикрепленные файлы, я что-то пропустил?

1 Ответ

0 голосов
/ 05 октября 2018

multipart/form-data - это составное сообщение MIME, как определено в RFC 2046 .Базовая структура составного сообщения MIME в примере сообщения multipart/form-data выглядит следующим образом:

Content-type:  multipart/form-data; boundary=foo

--foo
Content-Disposition: form-data; name=key1

abcde
--foo
Content-Disposition: form-data; name=key2; filename=foo.txt

01234
--foo--

Как видите, граница foo определена в атрибуте border, используется какразделитель между частями с --foo и используется в качестве конечной границы как --foo--.

Ваш код вместо этого определяет границу не как foo, а как --foo, а затем пытается все еще использовать только --foo в качестве разделителя между частями.Чтобы исправить ваш код, вам нужно либо установить границу только -WebKitFormBoundary67 вместо ---WebKitFormBoundary67, либо использовать -----WebKitFormBoundary67 в качестве разделителя вместо только ---WebKitFormBoundary67.

...