原文: https://howtodoinjava.com/jersey/jax-rs-jersey-ajax-multi-file-upload-example/

了解如何结合使用 Ajax 和 JAX-RS 网络服务(示例中使用 Jersey)一次性上传多个文件。 还要看看基于表单的文件上传示例文件下载示例

Jersey - Ajax 多文件上传示例 - 图1

  1. Table of Contents
  2. Jersey maven multipart dependency
  3. Add MultiPartFeature
  4. Write Upload REST API
  5. HTML/Ajax code
  6. Demo of Multiple files upload

Jersey Maven 多部分依赖

要使用多部分功能,您需要将jersey-media-multipart模块以及其他必需的模块添加到pom.xml文件中。

  1. <project xmlns="http://maven.apache.org/POM/4.0.0"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
  4. http://maven.apache.org/xsd/maven-4.0.0.xsd;
  5. <modelVersion>4.0.0</modelVersion>
  6. <groupId>com.howtodoinjava.jersey</groupId>
  7. <artifactId>JerseyDemos</artifactId>
  8. <version>0.0.1-SNAPSHOT</version>
  9. <packaging>war</packaging>
  10. <repositories>
  11. <repository>
  12. <id>maven2-repository.java.net</id>
  13. <name>Java.net Repository for Maven</name>
  14. <url>http://download.java.net/maven/2/</url>
  15. <layout>default</layout>
  16. </repository>
  17. </repositories>
  18. <properties>
  19. <jersey2.version>2.19</jersey2.version>
  20. <jaxrs.version>2.0.1</jaxrs.version>
  21. </properties>
  22. <dependencies>
  23. <!-- JAX-RS -->
  24. <dependency>
  25. <groupId>javax.ws.rs</groupId>
  26. <artifactId>javax.ws.rs-api</artifactId>
  27. <version>${jaxrs.version}</version>
  28. </dependency>
  29. <!-- Jersey2.19 -->
  30. <dependency>
  31. <groupId>org.glassfish.jersey.containers</groupId>
  32. <artifactId>jersey-container-servlet</artifactId>
  33. <version>${jersey2.version}</version>
  34. </dependency>
  35. <dependency>
  36. <groupId>org.glassfish.jersey.core</groupId>
  37. <artifactId>jersey-server</artifactId>
  38. <version>${jersey2.version}</version>
  39. </dependency>
  40. <dependency>
  41. <groupId>org.glassfish.jersey.core</groupId>
  42. <artifactId>jersey-client</artifactId>
  43. <version>${jersey2.version}</version>
  44. </dependency>
  45. <dependency>
  46. <groupId>org.glassfish.jersey.media</groupId>
  47. <artifactId>jersey-media-multipart</artifactId>
  48. <version>${jersey2.version}</version>
  49. </dependency>
  50. </dependencies>
  51. <build>
  52. <finalName>JerseyDemos</finalName>
  53. <plugins>
  54. <plugin>
  55. <artifactId>maven-compiler-plugin</artifactId>
  56. <configuration>
  57. <source>1.7</source>
  58. <target>1.7</target>
  59. </configuration>
  60. </plugin>
  61. </plugins>
  62. </build>
  63. </project>

添加MultiPartFeature

此外,还需要在 Jersey 配置中添加MultiPartFeature,以使其知道您将使用多部分请求。 最简单的方法是通过web.xml文件添加支持。

  1. <!DOCTYPE web-app PUBLIC
  2. "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
  3. "http://java.sun.com/dtd/web-app_2_3.dtd" >
  4. <web-app>
  5. <display-name>Archetype Created Web Application</display-name>
  6. <servlet>
  7. <servlet-name>jersey-serlvet</servlet-name>
  8. <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
  9. <init-param>
  10. <param-name>jersey.config.server.provider.packages</param-name>
  11. <param-value>com.howtodoinjava.jersey</param-value>
  12. </init-param>
  13. <init-param>
  14. <param-name>jersey.config.server.provider.classnames</param-name>
  15. <param-value>org.glassfish.jersey.filter.LoggingFilter;
  16. org.glassfish.jersey.media.multipart.MultiPartFeature</param-value>
  17. </init-param>
  18. <load-on-startup>1</load-on-startup>
  19. </servlet>
  20. <servlet-mapping>
  21. <servlet-name>jersey-serlvet</servlet-name>
  22. <url-pattern>/rest/*</url-pattern>
  23. </servlet-mapping>
  24. </web-app>

编写上传 REST API

现在编写服务层 JAX-RS API,它实际上将具有将上传的文件存储在服务器上的逻辑。

  1. package com.howtodoinjava.jersey;
  2. import java.io.File;
  3. import java.io.FileOutputStream;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.io.OutputStream;
  7. import javax.ws.rs.Consumes;
  8. import javax.ws.rs.POST;
  9. import javax.ws.rs.Path;
  10. import javax.ws.rs.WebApplicationException;
  11. import javax.ws.rs.core.MediaType;
  12. import javax.ws.rs.core.Response;
  13. import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
  14. import org.glassfish.jersey.media.multipart.FormDataParam;
  15. @Path("/upload")
  16. public class JerseyService
  17. {
  18. @POST
  19. @Path("/pdf")
  20. @Consumes({MediaType.MULTIPART_FORM_DATA})
  21. public Response uploadPdfFile( @FormDataParam("file") InputStream fileInputStream,
  22. @FormDataParam("file") FormDataContentDisposition fileMetaData) throws Exception
  23. {
  24. String UPLOAD_PATH = "c:/temp/";
  25. try
  26. {
  27. int read = 0;
  28. byte[] bytes = new byte[1024];
  29. OutputStream out = new FileOutputStream(new File(UPLOAD_PATH + fileMetaData.getFileName()));
  30. while ((read = fileInputStream.read(bytes)) != -1)
  31. {
  32. out.write(bytes, 0, read);
  33. }
  34. out.flush();
  35. out.close();
  36. } catch (IOException e)
  37. {
  38. throw new WebApplicationException("Error while uploading file. Please try again !!");
  39. }
  40. return Response.ok(fileMetaData.getFileName() + " uploaded successfully !!").build();
  41. }
  42. }

HTML/Ajax 代码

是时候看看客户端代码了。 我编写了一个功能非常简单的非常简单的文件。 如果您要对其进行某些特定的更改,请告诉我。

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  2. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  4. <head>
  5. <meta content="text/html;charset=utf-8" http-equiv="Content-Type" />
  6. <meta content="utf-8" http-equiv="encoding" />
  7. <script src="./js/jquery.min.js"></script>
  8. <script type="text/javascript">
  9. $(document).ready(function()
  10. {
  11. $("#uploadBtn").click(function()
  12. {
  13. $('input[name="file"]').each(function(index, value)
  14. {
  15. var file = value.files[0];
  16. if(file)
  17. {
  18. var formData = new FormData();
  19. formData.append('file', file);
  20. $.ajax({
  21. url : '/JerseyDemos/rest/upload/pdf',
  22. type : 'POST',
  23. data : formData,
  24. cache : false,
  25. contentType : false,
  26. processData : false,
  27. success : function(data, textStatus, jqXHR) {
  28. var message = jqXHR.responseText;
  29. $("#messages").append("<li>" + message + "</li>");
  30. },
  31. error : function(jqXHR, textStatus, errorThrown) {
  32. $("#messages").append("<li style='color: red;'>" + textStatus + "</li>");
  33. }
  34. });
  35. }
  36. });
  37. });
  38. });
  39. </script>
  40. </head>
  41. <body>
  42. <h1>JAX-RS Multi-file Upload Example</h1>
  43. <form action="rest/upload/pdf" method="post" enctype="multipart/form-data">
  44. <p>
  45. Select file 1: <input type="file" name="file" size="45" accept=".pdf" />
  46. </p>
  47. <p>
  48. Select file 2: <input type="file" name="file" size="45" accept=".pdf" />
  49. </p>
  50. <p>
  51. Select file 3: <input type="file" name="file" size="45" accept=".pdf" />
  52. </p>
  53. <p>
  54. <input id="uploadBtn" type="button" value="Upload PFD Files" />
  55. </p>
  56. </form>
  57. <ul id="messages">
  58. </ul>
  59. </body>
  60. </html>

多个文件上传演示

演示时间。 在服务器上部署应用,然后单击 URL:http://localhost:8080/JerseyDemos/fileUpload.html

Jersey - Ajax 多文件上传示例 - 图2

Jersey 多文件上传示例 – 空白表格

现在选择两个/三个文件,然后单击上载按钮。 您将在屏幕上看到以下消息。 文件也将存储在服务器上。

Jersey - Ajax 多文件上传示例 - 图3

Jersey 多文件上传成功

在评论框中让我知道您的问题。

祝您学习愉快!