目录
单个下载(流)
1、设置响应类型和头信息
2、实现文件输出
单个下载(本地文件)
1、文件读取
2、设置响应类型和头信息
3、实现文件输出
单个下载(网络文件)
1、与服务器建立连接
2、设置响应类型和头信息
3、实现文件输出
压缩ZIP下载
1、设置响应类型和头信息
2、创建压缩流
3、向压缩文件中输出数据
批量下载
文件下载功能已经成为现代Web应用程序不可或缺的一部分。
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
Content-Type:用于指示接收方如何处理响应数据,并告知浏览器所需下载的文件类型
attachment:用于指示浏览器以下载方式显示响应数据
filename:用于指定下载文件的文件名
InputStream in = obsUploadUtils.downFile(url);
OutputStream out = response.getOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = in.read(buffer)) > 0) {
out.write(buffer, 0, len);
}
in.close();
out.close();
1.获取一个输入流,并将其用于访问服务器上的文件
2.使用ServletOutputStream类的getOutputStream()方法创建一个数据输出流,并将其用于输出文件数据
3.while循环逐个读取文件数据,并将其写入到输出流中
4.关闭输入输出流
InputStream in = new FileInputStream("c:/Operator.doc");
通过打开与实际文件的连接创建一个FileInputStream,传递一个String类型的文件路径
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
Content-Type:用于指示接收方如何处理响应数据,并告知浏览器所需下载的文件类型
attachment:用于指示浏览器以下载方式显示响应数据
filename:用于指定下载文件的文件名
OutputStream out = response.getOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = in.read(buffer)) > 0) {
out.write(buffer, 0, len);
}
in.close();
out.close();
1.获取一个输入流,并将其用于访问服务器上的文件
2.使用ServletOutputStream类的getOutputStream()方法创建一个数据输出流,并将其用于输出文件数据
3.while循环逐个读取文件数据,并将其写入到输出流中
4.关闭输入输出流
URL url = new URL(“”);
URLConnection conn = url.openConnection();
InputStream in = conn.getInputStream();
1.在url中输入要解析的网络文件路径
2.通过在 URL 上调用 openConnection 方法创建连接对象
3.通过getInputStream()获取对象的输入流
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
Content-Type:用于指示接收方如何处理响应数据,并告知浏览器所需下载的文件类型
attachment:用于指示浏览器以下载方式显示响应数据
filename:用于指定下载文件的文件名
OutputStream out = response.getOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = in.read(buffer)) > 0) {
out.write(buffer, 0, len);
}
in.close();
out.close();
1.获取一个输入流,并将其用于访问服务器上的文件
2.使用ServletOutputStream类的getOutputStream()方法创建一个数据输出流,并将其用于输出文件数据
3.while循环逐个读取文件数据,并将其写入到输出流中
4.关闭输入输出流
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
Content-Type:用于指示接收方如何处理响应数据,并告知浏览器所需下载的文件类型
attachment:用于指示浏览器以下载方式显示响应数据
filename:用于指定下载文件的文件名
ZipOutputStream out = new ZipOutputStream(response.getOutputStream());
用于将数据压缩为ZIP文件格式。它提供了一种方便的方式来创建包含多个文件或目录的ZIP文件
response.getOutputStream():用于写入ZIP文件数据的输出流
for (String object : objectLists) {
ObsObject obsObject = obsClient.getObject(bucketName,object);
String objectKey = obsObject.getObjectKey();
if (!objectKey.endsWith("/")){
int index = objectKey.lastIndexOf("/");
String fileName = objectKey.substring(index+1);
out.putNextEntry(new ZipEntry(fileName));
InputStream in = obsObject.getObjectContent();
int b;
while ((b = in.read())!=-1){
out.write(b);
}
}
}
public class MultiThreadDownloader {
private static final int BUFFER_SIZE = 4096;
private static final int NUM_THREADS = 4;
public static void main(String[] args) {
List urls = new ArrayList<>();
urls.add("https://example.com/file1.txt");
urls.add("https://example.com/file2.txt");
urls.add("https://example.com/file3.txt");
urls.add("https://example.com/file4.txt");
int numFiles = urls.size();
int numThreads = Math.min(numFiles, NUM_THREADS);
List threads = new ArrayList<>();
for (int i = 0; i < numThreads; i++) {
int start = i * numFiles / numThreads;
int end = (i + 1) * numFiles / numThreads;
List subUrls = urls.subList(start, end);
Thread thread = new DownloadThread(subUrls);
thread.start();
threads.add(thread);
}
for (Thread thread : threads) {
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private static class DownloadThread extends Thread {
private List urls;
public DownloadThread(List urls) {
this.urls = urls;
}
@Override
public void run() {
for (String url : urls) {
try {
downloadFile(url);
} catch (IOException e) {
e.printStackTrace();
}
}
}
private void downloadFile(String urlStr) throws IOException {
URL url = new URL(urlStr);
String fileName = url.getFile().substring(url.getFile().lastIndexOf('/') + 1);
BufferedInputStream in = new BufferedInputStream(url.openStream());
FileOutputStream out = new FileOutputStream(fileName);
byte[] buffer = new byte[BUFFER_SIZE];
int bytesRead;
while ((bytesRead = in.read(buffer, 0, BUFFER_SIZE)) != -1) {
out.write(buffer, 0, bytesRead);
}
in.close();
out.close();
}
}
1.将下载的文件 URL 存储在一个列表中,然后将其分成多个子列表,每个子列表由一个线程处理
2.每个线程都会遍历其子列表中的 URL,并下载每个文件
3.下载的文件将保存在当前工作目录中,文件名将从 URL 中提取