Trying to upload a file to a JAX-RS (jersey) server(尝试将文件上传到 JAX-RS (jersey) 服务器)
问题描述
我正在尝试使用带有 Jersey 的 multipart/form-data 客户端上传文件和其他表单数据.我也在使用 Jersey 上传到 REST Web 服务.这是服务器代码:
I'm trying to upload a file and other form data using multipart/form-data client with Jersey. I'm uploading to a REST web service also using Jersey. Here is the server code:
@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces(MediaType.APPLICATION_JSON)
public String create(@FormDataParam("file") InputStream file,
@FormDataParam("file") FormDataContentDisposition fileInfo,
@FormDataParam("name") String name,
@FormDataParam("description") String description) {
Ingredient ingredient = new Ingredient();
ingredient.setName(name);
ingredient.setDescription(description);
ingredient.setImageName(fileInfo.getFileName());
ingredient.setImagePath(context.getRealPath("/resources/uploads/"));
// TODO save the file.
try {
JSONObject json = new JSONObject();
try {
ingredientService.create(ingredient);
} catch (final InvalidParameterException ex) {
logger.log(Level.INFO, ex.getMessage());
json.put("result", false);
json.put("error", ex.getMessage());
return json.toString();
} catch (final GoodDrinksException ex) {
logger.log(Level.WARNING, null, ex);
json.put("result", false);
json.put("error", ex.getMessage());
return json.toString();
}
json.put("ingredient", JsonUtil.ingredientToJSON(ingredient));
return json.put("result", true).toString();
} catch (JSONException ex) {
logger.log(Level.SEVERE, null, ex);
return "{"result",false}";
}
}
我已经在我的桌面上使用基本的 html 表单测试了服务器代码,它运行良好.问题似乎出在客户端.这是相关的客户端代码.
I've tested the server code using a basic html form on my desktop and it works fine. The problem seems to be in the client. Here is the relevant client code.
ClientConfig config = new DefaultClientConfig();
client = Client.create(config);
client.addFilter(new LoggingFilter());
webResource = client.resource("http://localhost:8080/webapp/resources").path("ingredient");
FormDataMultiPart fdmp = new FormDataMultiPart();
if (file != null) {
fdmp.bodyPart(new FileDataBodyPart("file", file, MediaType.APPLICATION_OCTET_STREAM_TYPE));
}
fdmp.bodyPart(new FormDataBodyPart("name", ingredient.getName()));
fdmp.bodyPart(new FormDataBodyPart("description", ingredient.getDescription()));
ClientResponse response = webResource.type(MediaType.MULTIPART_FORM_DATA_TYPE).post(ClientResponse.class, fdmp);
String string = response.getEntity(String.class);
logger.log(Level.INFO, "response: {0}", string);
我收到来自服务器的 400 响应客户端发送的请求在语法上不正确"
I'm getting a 400 response from the server "The request sent by the client was syntactically incorrect"
这是从记录器中吐出的消息,这个没有文件以保持输出简短:
Here is the message that is spit out of the logger, this one is without a file to keep the output brief:
1 > POST http://localhost:8080/webapp/resources/ingredient
1 > Content-Type: multipart/form-data
1 >
--Boundary_5_1545082086_1303666703655
Content-Type: text/plain
Content-Disposition: form-data;name="name"
Adam
--Boundary_5_1545082086_1303666703655
Content-Type: text/plain
Content-Disposition: form-data;name="description"
Test
--Boundary_5_1545082086_1303666703655--
为了让它正常工作,我在客户端做错了什么?
What am I doing wrong in the client to get this working correctly?
推荐答案
如果你想将字符串添加到 FormDataMultiPart
只需使用 .field("name", "value")
方法与用于文件附件的方法相同(queryParam 不起作用).
If you want to add Strings to the FormDataMultiPart
just use the .field("name", "value")
method the same way it is used for the file attachment (queryParam does not work).
下面是一个工作示例:
首先,将读取文件的内容作为字符串返回的服务器部分:
First, the server part which returns the content of the read file as a String:
@Path("file")
public class FileResource {
@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response handleUpload(@FormDataParam("file") InputStream stream) throws Exception {
return Response.ok(IOUtils.toString(stream)).build();
}
}
二、发布文件的客户端方法:
Second, the client method posting the file:
public void upload(String url, String fileName) {
InputStream stream = getClass().getClassLoader().getResourceAsStream(fileName);
FormDataMultiPart part = new FormDataMultiPart().field("file", stream, MediaType.TEXT_PLAIN_TYPE);
WebResource resource = Client.create().resource(url);
String response = resource.type(MediaType.MULTIPART_FORM_DATA_TYPE).post(String.class, part);
assertEquals("Hello, World", response);
}
三、测试环境:
Server server;
@Before
public void before() throws Exception {
server = new Server(8080);
server.addHandler(new WebAppContext(WEB_INF_DIRECTORY, "/"));
server.start();
}
@After
public void after() throws Exception {
server.stop();
}
@Test
public void upload() {
upload("http://localhost:8080/file", "file.txt");
}
最后是maven依赖:
Finally, the maven dependencies:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-server</artifactId>
<version>1.6</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-client</artifactId>
<version>1.6</version>
</dependency>
<dependency>
<groupId>com.sun.jersey.contribs</groupId>
<artifactId>jersey-multipart</artifactId>
<version>1.6</version>
</dependency>
<dependency>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-embedded</artifactId>
<version>6.1.26</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.0.1</version>
</dependency>
</dependencies>
file.txt
位于类路径的根目录,包含 Hello, World
.
The file.txt
is at the root of the classpath and contains Hello, World
.
这篇关于尝试将文件上传到 JAX-RS (jersey) 服务器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:尝试将文件上传到 JAX-RS (jersey) 服务器
- Eclipse 插件更新错误日志在哪里? 2022-01-01
- Spring Boot连接到使用仲裁器运行的MongoDB副本集 2022-01-01
- Safepoint+stats 日志,输出 JDK12 中没有 vmop 操作 2022-01-01
- value & 是什么意思?0xff 在 Java 中做什么? 2022-01-01
- Jersey REST 客户端:发布多部分数据 2022-01-01
- C++ 和 Java 进程之间的共享内存 2022-01-01
- 将log4j 1.2配置转换为log4j 2配置 2022-01-01
- 从 finally 块返回时 Java 的奇怪行为 2022-01-01
- 如何使用WebFilter实现授权头检查 2022-01-01
- Java包名称中单词分隔符的约定是什么? 2022-01-01