# Jersey 文件下载示例 – `StreamingOutput`

> 原文： [https://howtodoinjava.com/jersey/jersey-streamingoutput/](https://howtodoinjava.com/jersey/jersey-streamingoutput/)

在此 **Jersey 文件下载示例**中，我们将学习编写一个 Jersey [rest api](//howtodoinjava.com/restful-web-service/) ，该 API 可以流式传输或下载文件（例如 PDF/Excel/Text 文件）发送给请求的客户端。 我将使用[`javax.ws.rs.core.StreamingOutput`](https://docs.oracle.com/javaee/7/api/javax/ws/rs/core/StreamingOutput.html)类来构建此 **JAX-RS** API。

```java
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 的源代码。

```java
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](img/4feb11b8201c726f68492d2ed83e7780.png)

Jersey 文件下载示例

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

## 3\. Maven 依赖

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

```java
<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 配置](//howtodoinjava.com/jersey/jersey-2-hello-world-application-tutorial/)，请参考`web.xml`文件。

```java
<!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>

```

[源码下载](//howtodoinjava.com/wp-content/uploads/2015/08/JerseyDemos_FileDownload.zip)

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

学习愉快！