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 part=@file.txt url 上传文件时

我收到 HTTP 415-不支持的媒体类型错误。怎么了 ?

4

5 回答 5

6

这可能由于几个原因而发生。我设法缩小了其中一些范围。

  1. 您的 Content-Type 标头与 @Consumes 标头提供的标头不匹配。使用代理验证这一点。

  2. 您设法偶然发现了Jersey 1.4 中修复的与 FormDataParam 注释相关的错误。

  3. 您将 jersey-bundle 和 jersey-server 等都包含在同一个二进制文件中,它们相互竞争。

  4. 您正在使用 @FormParam 而不是 @FormDataParam。

  5. 由于与 jersey-multipart 和其他 jersey jar 冲突,内省 API 无法识别您的 @FormDataParam。如果一个 jar 的版本为 1.x,请确保其他 jar 的版本相同。在调试 jersey API 代码时,我注意到如果 jar 版本不统一,这些方法注释会变成空白(在 jersey 的代码上)。REST 服务上的所有方法参数都被 POST 请求的主体内容替换,无论它们应该包含哪个 FormDataParam。

于 2012-08-05T16:36:39.143 回答
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());
        }
     }
   }
}
}

(需要 servlet-api.jar、(apache)commons-oi.jar 和(apache)commons-fileupload.jar)

于 2012-08-29T17:55:36.977 回答
1

请确保您在类路径中有mimepull.jar

于 2014-02-10T13:40:38.167 回答
1

您可能需要按照 Jersey 文档第8.3.1.2章注册中的说明注册MultipartFeature

创建一个类似这样的类:

/**
 * 
 */
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 添加到 web.xml 中的 Jersey servlet:

     <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>com.verico.multipart.app.MultiPartApp</param-value>
    </init-param>
于 2014-04-11T08:46:04.097 回答
0

您是否尝试过输入流?

喜欢

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

对我来说很好。

于 2012-07-17T18:12:13.597 回答