使用球衣文件上传的HTTP 415(Http 415 on file Upload using je

2019-06-24 11:44发布

我对REST风格的文件上传代码:

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

当我尝试上传文件中使用卷发-X POST --form part=@file.txt网址

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

Answer 1:

尝试了很多的例子之后finaly找到实物工作示例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文件,(阿帕奇)公地oi.jar和(阿帕奇)的commons-fileupload.jar)



Answer 2:

这可以一对夫妇的原因发生所致。 我设法缩小其中的一些。

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

  2. 您在管理绊倒的错误是固定在泽西岛1.4相关FormDataParam注解。

  3. 你包括球衣束和球衣服务器等所有在相同的二进制和他们相互竞争。

  4. 您正在使用@FormParam代替@FormDataParam。

  5. 你@FormDataParam通过内省API,因为与新泽西州的多和其他球衣罐子冲突无法识别。 如果一个罐子的1.x版本确保其他罐子上的版本相同。 在调试球衣API代码我注意到,这些方法的注释打开了空白(球衣上的代码)如果jar版本并不统一。 在REST服务的所有方法的参数是由POST请求而不管其FormDataParam他们都应该包含的主体内容替换。



Answer 3:

请确保您有mimepull.jar在classpath



Answer 4:

您可能需要注册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添加到您的web.xml中的servlet球衣:

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


Answer 5:

你有一个输入流试过吗?

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

对我来说工作正常。



文章来源: Http 415 on file Upload using jersey