Загрузить файл с Джерси 2


Мне нужно загрузить двоичный файл через вызов rest, используя Jersey 2

Я написал следующий класс:

@Path("/entry-point")
public class EntryPoint {

    @POST
    @Path("/upload")
    @Consumes(MediaType.APPLICATION_OCTET_STREAM)
    public String uploadStream( InputStream payload ) throws IOException
    {
        while(true) {
            try {
                DataInputStream dis = new DataInputStream(payload);
                System.out.println(dis.readByte());
            } catch (Exception e) {
                break;
            }
        }
        //Or you can save the inputsream to a file directly, use the code, but must remove the while() above.
        /**
         OutputStream os =new FileOutputStream("C:recieved.jpg");
         IOUtils.copy(payload,os);
         **/
        System.out.println("Payload size="+payload.available());
        return "Payload size="+payload.available();
    }

}

Когда я пытаюсь сделать что-то вроде следующего:

curl --request POST --data-binary "@file.txt" http://localhost:8080/entry-point/upload

Я получаю следующий ответ:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/>
<title>Error 415 </title>
</head>
<body>
<h2>HTTP ERROR: 415</h2>
<p>Problem accessing /entry-point/up. Reason:
<pre>    Unsupported Media Type</pre></p>
<hr /><a href="http://eclipse.org/jetty">Powered by Jetty:// 9.3.6.v20151106</a><hr/>
</body>
</html>

Где я ошибаюсь?

3 2

3 ответа:

Вы должны использовать MediaType.MULTIPART_FORM_DATA, чтобы указать Джерси, что вы собираетесь получить файл. Кроме того, вы должны "подсказать" Джерси, какое поле должно быть тем, которое вы хотите прочитать. Исправленная версия будет выглядеть следующим образом :

 @Consumes(MediaType.MULTIPART_FORM_DATA)
 public String uploadStream( @FormDataParam("file") InputStream payload ) throws IOException {

Обратите внимание на этот Медиатип.APPLICATION_OCTET_STREAM-это универсальный Медиатип. Для более детального объяснения проверьте: нужен ли мне Content-Type: application / octet-stream для загрузки файла?

Я решил удалить @Consumes аннотацию.

Вот так

public String uploadStream(InputStream payload) throws IOException {}

Серверная сторона выглядит нормально. Добавление типа content mime, как указано в ошибке, решило проблему для меня:

-H 'Content-Type: application/octet-stream'