2012-05-15 34 views
6

Mã của tôi cho RESTful tập tin tải lên:Http 415 trong hồ sơ Tải lên bằng jersey

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

Khi tôi cố gắng để tải lên một tập tin sử dụng curl curl -X POST --form url [email protected]

Tôi nhận được Lỗi loại phương tiện không hỗ trợ HTTP 415. Chuyện gì thế ?

Trả lời

5

Sau khi thử rất nhiều ví dụ finaly tìm ví dụ thực sự làm việc trên 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()); 
     } 
    } 
    } 
} 
} 

(cần servlet-api.jar, (apache) commons-oi.jar và (apache) commons -fileupload.jar)

0

Bạn đã thử với luồng Đầu vào chưa?

Giống như:

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

trình tốt cho tôi.

5

Điều này có thể xảy ra do một vài lý do. Tôi xoay sở để thu hẹp một số người trong số họ.

  1. Tiêu đề Loại nội dung của bạn không khớp với tiêu đề được cung cấp bởi tiêu đề @Consumes. Xác minh điều này bằng proxy.

  2. Bạn đã xoay xở để gặp a bug đã được sửa trong Jersey 1.4 liên quan đến chú thích FormDataParam.

  3. Bạn bao gồm gói áo và máy chủ jersey và tất cả trong cùng một tệp nhị phân và chúng đang cạnh tranh với nhau.

  4. Bạn đang sử dụng @FormParam thay vì @FormDataParam.

  5. @FormDataParam của bạn không được API xác định bởi vì các xung đột với áo-đa và các loại áo khác. Nếu một bình là phiên bản 1.x, hãy chắc chắn rằng các lọ khác có cùng phiên bản. Trong khi gỡ lỗi mã API jersey, tôi nhận thấy rằng các chú thích phương pháp này bật lên trống (trên mã của áo) nếu các phiên bản jar không đồng đều. Tất cả các tham số của phương thức trên dịch vụ REST được thay thế bởi nội dung của yêu cầu POST, bất chấp FormDataParam mà chúng được cho là chứa.

1

Hãy chắc chắn rằng bạn có mimepull.jar trên classpath

1

bạn có thể cần phải đăng ký MultipartFeature như được mô tả trong tài liệu của Jersey, chương 8.3.1.2 Registration.

Tạo một cái gì đó lớp như thế này:

/** 
* 
*/ 
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); 
    } 
} 

Và thêm init-param sau để servlet Jersey của bạn trong web.xml:

 <init-param> 
     <param-name>javax.ws.rs.Application</param-name> 
     <param-value>com.verico.multipart.app.MultiPartApp</param-value> 
    </init-param> 
Các vấn đề liên quan