向 Jersey multipart-form-data 函数添加注释会破坏它
Adding annotations to a Jersey multipart-form-data function breaks it
我有 Tomcat Jersey 服务,它应该接受文件和其他参数。以下代码说明了用例:
@POST
@Path("/fileupload")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public void post(@FormDataParam("file")File file, @FormDataParam("fileType")String fileType) throws FileNotFoundException
{
//Your local disk path where you want to store the file
String uploadedFileLocation = "C://AlienTemp/" + file.getName();
System.out.println(uploadedFileLocation);
System.out.println(fileType);
// save it
File objFile=new File(uploadedFileLocation);
if(objFile.exists())
{
objFile.delete();
}
saveToFile(new FileInputStream(file), uploadedFileLocation);
}
private 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();
}
}
上传本身有效,但前提是我删除了 fileType 参数和 all 注释。如果存在任何注释,则它不起作用。 Tomcat 抛出无用的 400 错误:"The request sent by the client was syntactically incorrect."。如果我不指定任何注释,则 servlet 不会启动,并引发资源错误。
换句话说,只有一个参数(文件)没有任何注释,上传请求才会成功。
其他详情:
- Tomcat: 8.0.21 嵌入
- 球衣:2.22.1
- 客户端:Chrome
中的 Postman 应用
- Java: 1.8
为什么注释不起作用?
编辑 1:
这是服务器输出的内容:
Apr 10, 2016 5:04:51 AM org.glassfish.jersey.filter.LoggingFilter log
INFO: 2 * Server has received a request on thread http-nio-8070-exec-2
2 > POST http://localhost:8070/web/feaf/fileupload
2 > accept: */*
2 > accept-encoding: gzip, deflate
2 > accept-language: en-US,en;q=0.8
2 > cache-control: no-cache
2 > connection: keep-alive
2 > content-length: 3903
2 > content-type: multipart/form-data
2 > host: localhost:8070
2 > origin: chrome-extension://fhbjgbiflinjbdggehcddcbncdddomop
2 > postman-token: 4eb8418b-9976-ca61-6d0e-f98c7d96d3b8
2 > user-agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.110 Safari/537.36
Apr 10, 2016 5:04:51 AM org.glassfish.jersey.filter.LoggingFilter log
INFO: 2 * Server responded with a response on thread http-nio-8070-exec-2
2 < 400
这是 Postman 的屏幕截图:
编辑 2:
这是 web.xml。我不得不更改服务名称并删除一些不相关的 servlet。
<?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>MyWebservice</display-name>
<welcome-file-list>
<welcome-file>status.jsp</welcome-file>
</welcome-file-list>
<!-- RESTful services -->
<servlet>
<servlet-name>feaf Service</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>web.feaf</param-value>
</init-param>
<init-param>
<param-name>jersey.config.server.provider.classnames</param-name>
<param-value>org.glassfish.jersey.filter.LoggingFilter;org.glassfish.jersey.media.multipart.MultiPartFeature</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>feaf Service</servlet-name>
<url-pattern>/web/feaf/*</url-pattern>
</servlet-mapping>
</web-app>
编辑 3:
感谢@Sanj,事实证明 Jersey 拒绝了 header 中带有 multipart-form-data 的请求,至少来自 Postman。发送一个空 header 可以解决问题。
您的代码看起来不错。 dependencies(pom.xml) 或 web.xml.
可能有问题
这是使用 jersey 2.22.1 @ https://github.com/shaimakh/so36524919
的工作文件上传示例
这是我的示例中的依赖项和 web.xml:
pom.xml(依赖项)
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-server</artifactId>
<version>2.22.1</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-multipart</artifactId>
<version>2.22.1</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet-core</artifactId>
<version>2.22.1</version>
</dependency>
web.xml
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Restful File Upload</display-name>
<servlet>
<servlet-name>jersey-servlet</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.foo.rest</param-value>
</init-param>
<init-param>
<param-name>jersey.config.server.provider.classnames</param-name>
<param-value>org.glassfish.jersey.media.multipart.MultiPartFeature</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>jersey-servlet</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>
邮差输出
我有 Tomcat Jersey 服务,它应该接受文件和其他参数。以下代码说明了用例:
@POST
@Path("/fileupload")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public void post(@FormDataParam("file")File file, @FormDataParam("fileType")String fileType) throws FileNotFoundException
{
//Your local disk path where you want to store the file
String uploadedFileLocation = "C://AlienTemp/" + file.getName();
System.out.println(uploadedFileLocation);
System.out.println(fileType);
// save it
File objFile=new File(uploadedFileLocation);
if(objFile.exists())
{
objFile.delete();
}
saveToFile(new FileInputStream(file), uploadedFileLocation);
}
private 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();
}
}
上传本身有效,但前提是我删除了 fileType 参数和 all 注释。如果存在任何注释,则它不起作用。 Tomcat 抛出无用的 400 错误:"The request sent by the client was syntactically incorrect."。如果我不指定任何注释,则 servlet 不会启动,并引发资源错误。
换句话说,只有一个参数(文件)没有任何注释,上传请求才会成功。
其他详情:
- Tomcat: 8.0.21 嵌入
- 球衣:2.22.1
- 客户端:Chrome 中的 Postman 应用
- Java: 1.8
为什么注释不起作用?
编辑 1:
这是服务器输出的内容:
Apr 10, 2016 5:04:51 AM org.glassfish.jersey.filter.LoggingFilter log
INFO: 2 * Server has received a request on thread http-nio-8070-exec-2
2 > POST http://localhost:8070/web/feaf/fileupload
2 > accept: */*
2 > accept-encoding: gzip, deflate
2 > accept-language: en-US,en;q=0.8
2 > cache-control: no-cache
2 > connection: keep-alive
2 > content-length: 3903
2 > content-type: multipart/form-data
2 > host: localhost:8070
2 > origin: chrome-extension://fhbjgbiflinjbdggehcddcbncdddomop
2 > postman-token: 4eb8418b-9976-ca61-6d0e-f98c7d96d3b8
2 > user-agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.110 Safari/537.36
Apr 10, 2016 5:04:51 AM org.glassfish.jersey.filter.LoggingFilter log
INFO: 2 * Server responded with a response on thread http-nio-8070-exec-2
2 < 400
这是 Postman 的屏幕截图:
编辑 2:
这是 web.xml。我不得不更改服务名称并删除一些不相关的 servlet。
<?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>MyWebservice</display-name>
<welcome-file-list>
<welcome-file>status.jsp</welcome-file>
</welcome-file-list>
<!-- RESTful services -->
<servlet>
<servlet-name>feaf Service</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>web.feaf</param-value>
</init-param>
<init-param>
<param-name>jersey.config.server.provider.classnames</param-name>
<param-value>org.glassfish.jersey.filter.LoggingFilter;org.glassfish.jersey.media.multipart.MultiPartFeature</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>feaf Service</servlet-name>
<url-pattern>/web/feaf/*</url-pattern>
</servlet-mapping>
</web-app>
编辑 3:
感谢@Sanj,事实证明 Jersey 拒绝了 header 中带有 multipart-form-data 的请求,至少来自 Postman。发送一个空 header 可以解决问题。
您的代码看起来不错。 dependencies(pom.xml) 或 web.xml.
可能有问题这是使用 jersey 2.22.1 @ https://github.com/shaimakh/so36524919
的工作文件上传示例这是我的示例中的依赖项和 web.xml:
pom.xml(依赖项)
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-server</artifactId>
<version>2.22.1</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-multipart</artifactId>
<version>2.22.1</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet-core</artifactId>
<version>2.22.1</version>
</dependency>
web.xml
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Restful File Upload</display-name>
<servlet>
<servlet-name>jersey-servlet</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.foo.rest</param-value>
</init-param>
<init-param>
<param-name>jersey.config.server.provider.classnames</param-name>
<param-value>org.glassfish.jersey.media.multipart.MultiPartFeature</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>jersey-servlet</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>
邮差输出