Java 未找到com.sun.jersey.core.header.FormDataContentDisposition类的消息正文读取器
我已经编写了一个rest服务来上传文件。我使用的文件上传休息容易。此外,我还尝试了我在SO上找到的有关问题的所有解决方案。但这对我不起作用。 下面是我的端点定义Java 未找到com.sun.jersey.core.header.FormDataContentDisposition类的消息正文读取器,java,rest,file-upload,resteasy,Java,Rest,File Upload,Resteasy,我已经编写了一个rest服务来上传文件。我使用的文件上传休息容易。此外,我还尝试了我在SO上找到的有关问题的所有解决方案。但这对我不起作用。 下面是我的端点定义 @POST @Consumes(MediaType.MULTIPART_FORM_DATA) @Path("/ckeditorUpload") public String uploadCkEditorFile(@FormDataParam("file") InputStream uploadedInputStream, @Form
@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Path("/ckeditorUpload")
public String uploadCkEditorFile(@FormDataParam("file") InputStream uploadedInputStream,
@FormDataParam("file") FormDataContentDisposition fileMetaData);
下面是我的pom.xml中的rest easy依赖项
<!-- JAXB provider -->
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxb-provider</artifactId>
<version>2.3.1.GA</version>
</dependency>
<!-- Multipart support -->
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-multipart-provider</artifactId>
<version>2.3.1.GA</version>
</dependency>
</dependencies>
任何帮助都将不胜感激 很难说您提供的代码有什么问题,但下面的代码是有效的: pom.xml
...
<dependencies>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxrs</artifactId>
<version>3.0.4.Final</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-multipart-provider</artifactId>
<version>3.0.4.Final</version>
</dependency>
</dependencies>
...
。。。
org.jboss.resteasy
resteasy jaxrs
3.0.4.4最终版本
org.jboss.resteasy
resteasy多部分提供程序
3.0.4.4最终版本
...
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>JAXRS-RESTEasy</display-name>
<servlet-mapping>
<servlet-name>resteasy-servlet</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
<!-- Auto scan REST service -->
<context-param>
<param-name>resteasy.scan</param-name>
<param-value>true</param-value>
</context-param>
<!-- this should be the same URL pattern as the servlet-mapping property -->
<context-param>
<param-name>resteasy.servlet.mapping.prefix</param-name>
<param-value>/rest</param-value>
</context-param>
<listener>
<listener-class>
org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap
</listener-class>
</listener>
<servlet>
<servlet-name>resteasy-servlet</servlet-name>
<servlet-class>
org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher
</servlet-class>
</servlet>
</web-app>
JAXRS RESTEasy
RESTEasyServlet
/休息/*
轻松扫描
真的
resteasy.servlet.mapping.prefix
/休息
org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap
RESTEasyServlet
org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher
RESTEasyFileUploadService.java
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import java.util.Map;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.Response;
import org.jboss.resteasy.plugins.providers.multipart.InputPart;
import org.jboss.resteasy.plugins.providers.multipart.MultipartFormDataInput;
@Path("/files")
public class RESTEasyFileUploadService {
private static final String SERVER_UPLOAD_LOCATION_FOLDER = "C://path/where_to_store";
@POST
@Path("/upload")
@Consumes("multipart/form-data")
public Response uploadFile(MultipartFormDataInput input) {
String fileName = "";
Map<String, List<InputPart>> formParts = input.getFormDataMap();
List<InputPart> inPart = formParts.get("file");
for (InputPart inputPart : inPart) {
try {
// Retrieve headers, read the Content-Disposition header to obtain the original name of the file
MultivaluedMap<String, String> headers = inputPart.getHeaders();
fileName = parseFileName(headers);
// Handle the body of that part with an InputStream
InputStream istream = inputPart.getBody(InputStream.class,null);
fileName = SERVER_UPLOAD_LOCATION_FOLDER + fileName;
saveFile(istream,fileName);
} catch (IOException e) {
e.printStackTrace();
}
}
String output = "File saved to server location : " + fileName;
return Response.status(200).entity(output).build();
}
// Parse Content-Disposition header to get the original file name
private String parseFileName(MultivaluedMap<String, String> headers) {
String[] contentDispositionHeader = headers.getFirst("Content-Disposition").split(";");
for (String name : contentDispositionHeader) {
if ((name.trim().startsWith("filename"))) {
String[] tmp = name.split("=");
String fileName = tmp[1].trim().replaceAll("\"","");
return fileName;
}
}
return "randomName";
}
// save uploaded file to a defined location on the server
private void saveFile(InputStream uploadedInputStream,
String serverLocation) {
try {
OutputStream outpuStream = new FileOutputStream(new File(serverLocation));
int read = 0;
byte[] bytes = new byte[1024];
outpuStream = new FileOutputStream(new File(serverLocation));
while ((read = uploadedInputStream.read(bytes)) != -1) {
outpuStream.write(bytes, 0, read);
}
outpuStream.flush();
outpuStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
导入java.io.File;
导入java.io.FileOutputStream;
导入java.io.IOException;
导入java.io.InputStream;
导入java.io.OutputStream;
导入java.util.List;
导入java.util.Map;
导入javax.ws.rs.Consumes;
导入javax.ws.rs.POST;
导入javax.ws.rs.Path;
导入javax.ws.rs.core.MultivaluedMap;
导入javax.ws.rs.core.Response;
导入org.jboss.resteasy.plugins.providers.multipart.InputPart;
导入org.jboss.resteasy.plugins.providers.multipart.MultipartFormDataInput;
@路径(“/files”)
公共类RESTEasyFileUploadService{
私有静态最终字符串服务器\u上载\u位置\u文件夹=“C://path/where\u to\u存储”;
@职位
@路径(“/upload”)
@使用(“多部分/表单数据”)
公共响应上载文件(MultipartFormDataInput){
字符串fileName=“”;
Map formParts=input.getFormDataMap();
List inPart=formParts.get(“文件”);
用于(输入部分输入部分:输入部分){
试一试{
//检索头,读取内容处置头以获取文件的原始名称
多值Map headers=inputPart.getHeaders();
文件名=解析文件名(标题);
//使用InputStream处理该部件的主体
InputStream istream=inputPart.getBody(InputStream.class,null);
fileName=服务器\上传\位置\文件夹+文件名;
保存文件(istream,文件名);
}捕获(IOE异常){
e、 printStackTrace();
}
}
String output=“保存到服务器位置的文件:”+文件名;
返回Response.status(200).entity(output.build();
}
//解析内容处置标头以获取原始文件名
私有字符串解析文件名(多值映射头){
字符串[]contentDispositionHeader=headers.getFirst(“内容处置”).split(;”);
for(字符串名称:contentDispositionHeader){
如果((name.trim().startsWith(“filename”)){
字符串[]tmp=name.split(“”);
字符串文件名=tmp[1].trim().replaceAll(“\”,”);
返回文件名;
}
}
返回“随机名称”;
}
//将上载的文件保存到服务器上定义的位置
私有void保存文件(InputStream上载InputStream,
字符串(位置){
试一试{
OutputStream OutputStream=新文件OutputStream(新文件(服务器位置));
int read=0;
字节[]字节=新字节[1024];
outpuStream=新文件outputstream(新文件(服务器位置));
while((read=uploadeInputStream.read(字节))!=-1){
outpuStream.write(字节,0,读取);
}
outpuStream.flush();
outpuStream.close();
}捕获(IOE异常){
e、 printStackTrace();
}
}
}
很难说您提供的代码有什么问题,但下面的代码是有效的:
pom.xml
...
<dependencies>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxrs</artifactId>
<version>3.0.4.Final</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-multipart-provider</artifactId>
<version>3.0.4.Final</version>
</dependency>
</dependencies>
...
。。。
org.jboss.resteasy
resteasy jaxrs
3.0.4.4最终版本
org.jboss.resteasy
resteasy多部分提供程序
3.0.4.4最终版本
...
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>JAXRS-RESTEasy</display-name>
<servlet-mapping>
<servlet-name>resteasy-servlet</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
<!-- Auto scan REST service -->
<context-param>
<param-name>resteasy.scan</param-name>
<param-value>true</param-value>
</context-param>
<!-- this should be the same URL pattern as the servlet-mapping property -->
<context-param>
<param-name>resteasy.servlet.mapping.prefix</param-name>
<param-value>/rest</param-value>
</context-param>
<listener>
<listener-class>
org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap
</listener-class>
</listener>
<servlet>
<servlet-name>resteasy-servlet</servlet-name>
<servlet-class>
org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher
</servlet-class>
</servlet>
</web-app>
JAXRS RESTEasy
RESTEasyServlet
/休息/*
轻松扫描
真的
resteasy.servlet.mapping.prefix
/休息
org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap
RESTEasyServlet
org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher
RESTEasyFileUploadService.java
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import java.util.Map;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.Response;
import org.jboss.resteasy.plugins.providers.multipart.InputPart;
import org.jboss.resteasy.plugins.providers.multipart.MultipartFormDataInput;
@Path("/files")
public class RESTEasyFileUploadService {
private static final String SERVER_UPLOAD_LOCATION_FOLDER = "C://path/where_to_store";
@POST
@Path("/upload")
@Consumes("multipart/form-data")
public Response uploadFile(MultipartFormDataInput input) {
String fileName = "";
Map<String, List<InputPart>> formParts = input.getFormDataMap();
List<InputPart> inPart = formParts.get("file");
for (InputPart inputPart : inPart) {
try {
// Retrieve headers, read the Content-Disposition header to obtain the original name of the file
MultivaluedMap<String, String> headers = inputPart.getHeaders();
fileName = parseFileName(headers);
// Handle the body of that part with an InputStream
InputStream istream = inputPart.getBody(InputStream.class,null);
fileName = SERVER_UPLOAD_LOCATION_FOLDER + fileName;
saveFile(istream,fileName);
} catch (IOException e) {
e.printStackTrace();
}
}
String output = "File saved to server location : " + fileName;
return Response.status(200).entity(output).build();
}
// Parse Content-Disposition header to get the original file name
private String parseFileName(MultivaluedMap<String, String> headers) {
String[] contentDispositionHeader = headers.getFirst("Content-Disposition").split(";");
for (String name : contentDispositionHeader) {
if ((name.trim().startsWith("filename"))) {
String[] tmp = name.split("=");
String fileName = tmp[1].trim().replaceAll("\"","");
return fileName;
}
}
return "randomName";
}
// save uploaded file to a defined location on the server
private void saveFile(InputStream uploadedInputStream,
String serverLocation) {
try {
OutputStream outpuStream = new FileOutputStream(new File(serverLocation));
int read = 0;
byte[] bytes = new byte[1024];
outpuStream = new FileOutputStream(new File(serverLocation));
while ((read = uploadedInputStream.read(bytes)) != -1) {
outpuStream.write(bytes, 0, read);
}
outpuStream.flush();
outpuStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
导入java.io.File;
导入java.io.FileOutputStream;
导入java.io.IOException;
导入java.io.InputStream;
导入java.io.OutputStream;
导入java.util.List;
导入java.util.Map;
导入javax.ws.rs.Consumes;
导入javax.ws.rs.POST;
导入javax.ws.rs.Path;
导入javax.ws.rs.core.MultivaluedMap;
导入javax.ws.rs.core.Response;
导入org.jboss.resteasy.plugins.providers.multipart.InputPart;
导入org.jboss.resteasy.plugins.providers.multipart.MultipartFormDataInput;
@路径(“/files”)
公共类RESTEasyFileUploadService{
私有静态最终字符串服务器\u上载\u位置\u文件夹=“C://path/where\u to\u存储”;
@职位
@路径(“/upload”)
@使用(“多部分/表单数据”)
公共响应上载文件(MultipartFormDataInput){
字符串fileName=“”;
Map formParts=input.getFormDataMap();
List inPart=formParts.get(“文件”