Вопрос по file-upload, java – Http 415 на файл Загрузить с помощью Джерси

6

Мой код для загрузки файла RESTful:

@Path("/upload") 
@POST 
@Consumes("multipart/form-data") 
public String post(
    @FormDataParam("part") String s, 
    @FormDataParam("part") FormDataContentDisposition d) { 
    return s + ":" + d.getFileName(); 
}

Когда я пытаюсь загрузить файл с помощью curl         curl -X POST --form [email protected] url

Я получаю сообщение об ошибке HTTP 415-Unsupported Media Type Error. Что случилось ?

Ваш Ответ

5   ответов
5

ые из них.

Your Content-Type header does not match with the one provided by the @Consumes header. Verify this with a proxy.

You managed to stumble upon a bug that was fixed in Jersey 1.4 related to the FormDataParam annotation.

You included jersey-bundle and jersey-server et all in the same binary and they are competing against each other.

You are using @FormParam instead of @FormDataParam.

Your @FormDataParam is unrecognized by the introspection API because of conflicts with jersey-multipart and other jersey jars. If one jar is of version 1.x make sure the other jars are on the same version. While debugging the jersey API code I noticed that these method annotations turn up blank (on jersey's code) if the jar versions are not uniform. All method parameters on the REST service are replaced by the body content of the POST request irrespective of which FormDataParam they are supposed to contain.

1

MultipartFeature как описано в документации Джерси, глава8.3.1.2 Регистрация.

Создайте класс примерно так:

/**
 * 
 */
package com.verico.multipart.app;

import javax.ws.rs.ApplicationPath;

import org.glassfish.jersey.media.multipart.MultiPartFeature;
import org.glassfish.jersey.server.ResourceConfig;

@ApplicationPath("/")
public class MultiPartApp extends ResourceConfig {

public MultiPartApp() {
    super(MultiPartFeature.class);
    }
}

И добавьте следующий init-param в ваш сервлет Jersey в web.xml:

     <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>com.verico.multipart.app.MultiPartApp</param-value>
    </init-param>
6

наконец, найдите действительно работающий пример наhttp://iambigd.blogspot.com/2011/06/java-upload-file-using-jersey.html

@POST
@Path("/simpleupload")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public void simpleUpload(
    //@Context UriInfo ui,
    @Context HttpServletRequest request
){
    String fileRepository = "D:\\";
    if (ServletFileUpload.isMultipartContent(request)) {
    FileItemFactory factory = new DiskFileItemFactory();
    ServletFileUpload upload = new ServletFileUpload(factory);
    List<FileItem> items = null;
    try {
        items = upload.parseRequest(request);
    } catch (FileUploadException e) {
        e.printStackTrace();
    }
    if (items != null) {
        Iterator<FileItem> iter = items.iterator();
        while (iter.hasNext()) {
            FileItem item = iter.next();
            if (!item.isFormField() && item.getSize() > 0) {
            System.out.println("File is found.");
            String fileName = processFileName(item.getName());
            try {
                String savePath = fileRepository + fileName;
                System.out.println("savePath:" + savePath);
                item.write(new File(savePath));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }else{
            System.out.println("getFieldName:" + item.getFieldName());
            System.out.println(item.getString());
        }
     }
   }
}
}

(нужен сервлет-api.jar, (apache) commons-oi.jar и (apache) commons-fileupload.jar)

Эй, спасибо за реальный код вместо логики. Это очень помогло.
0

Like :

@POST
@Consumes(MediaType.MULTIPART_FORM_DATA) 
public Response post(
        @Context HttpServletRequest request,
        @Context HttpHeaders headers, 
        @FormDataParam("file") InputStream fileStream,

У меня отлично работает.

1

mimepull.jar на пути к классам

Похожие вопросы