标题:JavaWeb响应下载功能实例代码(包含工具类)攻略
简介:本篇攻略将对JavaWeb中响应下载功能的实现进行详细讲解,介绍JavaWeb响应下载的基本原理以及必要的实现代码。最后附上工具类的完整代码,让读者能够轻松实现该功能。
基本原理
JavaWeb中响应下载功能的实现原理如下:
- 在用户请求下载资源时,服务器将该资源以流的形式传输给客户端。
- 在传输的过程中,服务器在响应头中设置Content-Disposition属性来告诉浏览器该资源是一个下载文件。该属性有两个值inline和attachment,其中inline是以浏览器默认方式打开,attachment是以附件方式下载。
- 浏览器接受到响应后,根据Content-Disposition属性进行相应的操作。如果是inline属性,则会在浏览器中显示该文件,如果是attachment属性,则弹出文件下载框,让用户选择下载位置。
实现步骤
基于上述实现原理,JavaWeb中响应下载功能的实现步骤如下:
- 获取到要下载的文件的输入流
首先需要获取到要下载的文件流,可以使用Java中的FileInputStream或者ServletContext的getResourceAsStream方法获取。
例如:如果下载的文件存在于项目的根目录下的download目录下,并且文件名称为test.zip,则获取文件输入流的代码为:
String downloadFilePath = request.getServletContext().getRealPath("/download/test.zip");
FileInputStream fis = new FileInputStream(downloadFilePath);
- 设置响应头
然后需要在响应头中设置Content-Disposition属性,告诉浏览器该资源是一个下载文件以及下载时的文件名称。
例如:如果要下载的文件名为test.zip,则设置响应头的代码为:
response.setHeader("Content-Disposition", "attachment;filename=test.zip");
- 获取输出流
然后需要获取到响应输出流,将下载文件流写入到输出流中。
例如:获取输出流的代码为:
OutputStream os = response.getOutputStream();
- 将文件流写入到输出流中
最后需要将下载文件流写入到输出流中,可以使用Java中的IOUtils的copy方法进行复制。
例如:将文件流写入到输出流中的代码为:
IOUtils.copy(fis, os);
完整实例
下面给出两个实例代码的说明和实现:
实例1
假设要下载的文件为test.zip,位于项目的根目录下的download目录下。
package com.example.demo;
import org.apache.tomcat.util.http.fileupload.IOUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
@Controller
public class DownloadController {
@GetMapping("/download")
public void download(HttpServletRequest request, HttpServletResponse response) throws IOException {
String downloadFilePath = request.getServletContext().getRealPath("/download/test.zip");
FileInputStream fis = new FileInputStream(downloadFilePath);
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=test.zip");
OutputStream os = response.getOutputStream();
IOUtils.copy(fis, os);
fis.close();
os.flush();
os.close();
}
}
实例2
假设要下载的文件为test.pdf,是一个网络文件。
package com.example.demo;
import org.apache.tomcat.util.http.fileupload.IOUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
@Controller
public class DownloadController {
@GetMapping("/download")
public void download(HttpServletRequest request, HttpServletResponse response) throws IOException {
String downloadUrl = "http://www.example.com/downloads/test.pdf";
URL url = new URL(downloadUrl);
URLConnection conn = url.openConnection();
conn.setConnectTimeout(5000);
response.setContentType("application/octet-stream");
// 根据文件名称对文件名进行编码
String fileName = URLEncoder.encode("test.pdf", StandardCharsets.UTF_8.toString());
response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
InputStream is = conn.getInputStream();
IOUtils.copy(is, response.getOutputStream());
is.close();
response.getOutputStream().flush();
response.getOutputStream().close();
}
}
工具类实现
最后,提供一个工具类的完整实现代码,供读者直接使用。
package com.example.demo;
import org.apache.tomcat.util.http.fileupload.IOUtils;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
public class DownloadUtil {
/**
* 下载本地文件
*
* @param response 响应对象
* @param filePath 文件路径
* @param fileName 下载时的文件名
*/
public static void downloadLocal(HttpServletResponse response, String filePath, String fileName) throws IOException {
FileInputStream fis = new FileInputStream(filePath);
download(response, fis, fileName);
}
/**
* 下载网络文件
*
* @param response 响应对象
* @param downloadUrl 下载文件的URL地址
* @param fileName 下载时的文件名
*/
public static void downloadNet(HttpServletResponse response, String downloadUrl, String fileName) throws IOException {
URL url = new URL(downloadUrl);
URLConnection conn = url.openConnection();
conn.setConnectTimeout(5000);
InputStream is = conn.getInputStream();
download(response, is, fileName);
}
/**
* 下载
*
* @param response 响应对象
* @param is 文件输入流
* @param fileName 下载时的文件名
*/
private static void download(HttpServletResponse response, InputStream is, String fileName) throws IOException {
response.setContentType("application/octet-stream");
// 根据文件名称对文件名进行编码
String encodeFileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8.toString());
response.setHeader("Content-Disposition", "attachment;filename=\"" + encodeFileName + "\"");
OutputStream os = response.getOutputStream();
IOUtils.copy(is, os);
is.close();
os.flush();
os.close();
}
}
读者可以通过调用DownloadUtil中的静态方法来实现下载功能。例如:
DownloadUtil.downloadLocal(response, "d:/test.zip", "test.zip");
DownloadUtil.downloadNet(response, "http://www.example.com/downloads/test.zip", "test.zip");
以上是关于JavaWeb响应下载功能实例代码(包含工具类)的详细攻略,希望对读者有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaWeb响应下载功能实例代码(包含工具类) - Python技术站