Jersey:MultiPart表单文件上传不支持的媒体类型(415)[重复]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Jersey:MultiPart表单文件上传不支持的媒体类型(415)[重复]相关的知识,希望对你有一定的参考价值。

这个问题在这里已有答案:

我在制作泽西岛文件上传服务时遇到了一些麻烦。

规范是这样的:服务器允许客户端使用GET方法访问文件。使用多部分表单数据处理程序,index.htmlal用户向POST多个文件。

但是,当我尝试上传CSV文件(Content-Type: text/csv)时,服务器立即回复415错误,既没有输入我的处理程序方法代码也没有吐出一些错误。

这是我的代码:

@Path("/ui/")
public class HtmlServer {
    static final Logger LOGGER = Logger.getLogger(HtmlServer.class.getCanonicalName());

    @GET
    @Path("/{file}")
    @Produces(MediaType.TEXT_HTML)
    public Response request(@PathParam("file") @DefaultValue("index.html") String path) {
        LOGGER.info("HTTP GET /ui/" + path);

        String data;
        try {
            if ("".equals(path))
                data = getFileBytes("web/index.html");
            else
                data = getFileBytes("web/" + path);
            return Response.ok(data, MediaType.TEXT_HTML).build();
        } catch (IOException e) {
            e.printStackTrace();
            return Response.ok("<h1>Server error</h1>", MediaType.TEXT_HTML).build();
        }
    }

    @POST
    @Path("/{file}")
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    public Response uploadFiles(final FormDataMultiPart multiPart) {
        List<FormDataBodyPart> bodyParts = multiPart.getFields("dataset");

        StringBuffer fileDetails = new StringBuffer("");

        /* Save multiple files */
        for (int i = 0; i < bodyParts.size(); i++) {
            BodyPartEntity bodyPartEntity = (BodyPartEntity) bodyParts.get(i).getEntity();
            String fileName = bodyParts.get(i).getContentDisposition().getFileName();
            saveToFile(bodyPartEntity.getInputStream(), "/.../" + fileName);
            fileDetails.append(" File saved to /.../" + fileName);
        }

        System.out.println(fileDetails);

        return Response.ok(fileDetails.toString()).build();
    }

    private static String getFileBytes(String path) throws IOException {
        byte[] bytes = Files.toByteArray(new File(path));
        return new String(bytes);
    }

    private static void saveToFile(InputStream uploadedInputStream, String uploadedFileLocation) {
        try {
            OutputStream out = null;
            int read = 0;
            byte[] bytes = new byte[1024];

            out = new FileOutputStream(new File(uploadedFileLocation));
            while ((read = uploadedInputStream.read(bytes)) != -1) {
                out.write(bytes, 0, read);
            }
            out.flush();
            out.close();
        } catch (IOException e) {

            e.printStackTrace();
        }
    }
}

在此先感谢您的帮助 !

答案

我认为问题在于您已将端点配置为接受multipart/form-data,但在上传请求的content-type时设置为text/csv。要求的content-type应设为multipart/form-data

如果您使用POSTMAN来测试API,则可以选择form-data,您可以在其中传递文本或文件。其他REST客户端也应具有类似的选项,或者您可以手动设置内容类型。

以上是关于Jersey:MultiPart表单文件上传不支持的媒体类型(415)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Java Jersey注册Multipart表单上载文件服务 - 错误:未找到消息正文阅读器

表单的enctype="multipart/form-data"

Jersey API中的多部分/表单数据出现CORS错误

jersey1.x集合html5使用FormData上传多文件实例

jersey1.x集合html5使用FormData上传多文件实例

为啥上传文件要使用multipart/form-data