Jersey 文件下载示例 – StreamingOutput

Jersey 文件下载示例 – StreamingOutput

原文: https://howtodoinjava.com/jersey/jersey-streamingoutput/

在此 Jersey 文件下载示例中,我们将学习编写一个 Jersey rest api ,该 API 可以流式传输或下载文件(例如 PDF/Excel/Text 文件)发送给请求的客户端。 我将使用javax.ws.rs.core.StreamingOutput类来构建此 JAX-RS API。

Table of Contents

1\. REST API to stream file with StreamingOutput
2\. Jersey file download demo
3\. Maven dependencies
4\. web.xml changes

1. 使用StreamingOutput传输文件的 REST API

以下是使用 JAX-RS Jersey 的StreamingOutput编写流式 REST API 的源代码。

package com.howtodoinjava.jersey;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.StreamingOutput;

@Path("/download")
public class JerseyService 
{
	@GET
	@Path("/pdf")
	public Response downloadPdfFile()
	{
		StreamingOutput fileStream =  new StreamingOutput() 
		{
			@Override
			public void write(java.io.OutputStream output) throws IOException, WebApplicationException 
			{
				try 
				{
					java.nio.file.Path path = Paths.get("C:/temp/test.pdf");
					byte[] data = Files.readAllBytes(path);
					output.write(data);
					output.flush();
				} 
				catch (Exception e) 
				{
					throw new WebApplicationException("File Not Found !!");
				}
			}
		};
		return Response
	            .ok(fileStream, MediaType.APPLICATION_OCTET_STREAM)
	            .header("content-disposition","attachment; filename = myfile.pdf")
	            .build();
	}
}

2. Jersey 文件下载演示

如果点击 URL “http://localhost:8080/JerseyDemos/rest/download/pdf”,则会在浏览器中显示以下警告,以下载文件。 PDF 文件将被保存的filename将是您在Response.header()方法中设置的。

Jersey file download example

Jersey 文件下载示例

请确保您在 API 代码中指定的路径中存在文件,否则会出错。

3. Maven 依赖

为了快速参考,请参阅下面我用于此演示的 maven 文件。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd;
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.howtodoinjava.jersey</groupId>
	<artifactId>JerseyDemos</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>war</packaging>
	<repositories>
		<repository>
			<id>maven2-repository.java.net</id>
			<name>Java.net Repository for Maven</name>
			<url>http://download.java.net/maven/2/</url>
			<layout>default</layout>
		</repository>
	</repositories>
	<properties>
		<jersey2.version>2.19</jersey2.version>
		<jaxrs.version>2.0.1</jaxrs.version>
	</properties>
	<dependencies>
		<!-- JAX-RS -->
		<dependency>
			<groupId>javax.ws.rs</groupId>
			<artifactId>javax.ws.rs-api</artifactId>
			<version>${jaxrs.version}</version>
		</dependency>
		<!-- Jersey2.19 -->
		<dependency>
			<groupId>org.glassfish.jersey.containers</groupId>
			<artifactId>jersey-container-servlet</artifactId>
			<version>${jersey2.version}</version>
		</dependency>
		<dependency>
			<groupId>org.glassfish.jersey.core</groupId>
			<artifactId>jersey-server</artifactId>
			<version>${jersey2.version}</version>
		</dependency>
		<dependency>
			<groupId>org.glassfish.jersey.core</groupId>
			<artifactId>jersey-client</artifactId>
			<version>${jersey2.version}</version>
		</dependency>
	</dependencies>
	<build>
		<finalName>JerseyDemos</finalName>
		<plugins>
			<plugin>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<source>1.7</source>
					<target>1.7</target>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>

4. web.xml的更改

另外,如果您正在使用Jersey2 配置,请参考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>Archetype Created Web Application</display-name>

  <servlet>
        <servlet-name>jersey-serlvet</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.howtodoinjava.jersey</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>jersey-serlvet</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>

</web-app>

源码下载

在下面的评论部分中,将有关 Java 流文件下载示例的问题交给我。

学习愉快!