首页 > 其他分享 >客户端下载服务端实例代码

客户端下载服务端实例代码

时间:2023-04-06 17:23:02浏览次数:39  
标签:文件 String buffer filename 实例 new response 服务端 客户端

1. 将文件以流的形式一次性读取到内存,通过响应输出流输出到前端

/**
* @param path 想要下载的文件的路径
* @param response
* @功能描述 下载文件:
*/
@RequestMapping("/download")
public void download(String path, HttpServletResponse response) {
try {
// path是指想要下载的文件的路径
File file = new File(path);
log.info(file.getPath());
// 获取文件名
String filename = file.getName();
// 获取文件后缀名
String ext = filename.substring(filename.lastIndexOf(".") + 1).toLowerCase();
log.info("文件后缀名:" + ext);
 
// 将文件写入输入流
FileInputStream fileInputStream = new FileInputStream(file);
InputStream fis = new BufferedInputStream(fileInputStream);
byte[] buffer = new byte[fis.available()];
fis.read(buffer);
fis.close();
 
// 清空response
response.reset();
// 设置response的Header
response.setCharacterEncoding("UTF-8");
//Content-Disposition的作用:告知浏览器以何种方式显示响应返回的文件,用浏览器打开还是以附件的形式下载到本地保存
//attachment表示以附件方式下载 inline表示在线打开 "Content-Disposition: inline; filename=文件名.mp3"
// filename表示文件的默认名称,因为网络传输只支持URL编码的相关支付,因此需要将文件名URL编码后进行传输,前端收到后需要反编码才能获取到真正的名称
response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8"));
// 告知浏览器文件的大小
response.addHeader("Content-Length", "" + file.length());
OutputStream outputStream = new BufferedOutputStream(response.getOutputStream());
response.setContentType("application/octet-stream");
outputStream.write(buffer);
outputStream.flush();
} catch (IOException ex) {
ex.printStackTrace();
}
} 

2、将输入流中的数据循环写入到响应输出流中,而不是一次性读取到内存,通过响应输出流输出到前端

/**
* @param path 指想要下载的文件的路径
* @param response
* @功能描述 下载文件:将输入流中的数据循环写入到响应输出流中,而不是一次性读取到内存
*/
@RequestMapping("/downloadLocal")
public void downloadLocal(String path, HttpServletResponse response) throws IOException {
// 读到流中
InputStream inputStream = new FileInputStream(path);// 文件的存放路径
response.reset();
response.setContentType("application/octet-stream");
String filename = new File(path).getName();
response.addHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(filename, "UTF-8"));
ServletOutputStream outputStream = response.getOutputStream();
byte[] b = new byte[1024];
int len;
//从输入流中读取一定数量的字节,并将其存储在缓冲区字节数组中,读到末尾返回-1
while ((len = inputStream.read(b)) > 0) {
outputStream.write(b, 0, len);
}
inputStream.close();
} 

3、下载网络文件到本地

/**
* @param path 下载后的文件路径和名称
* @param netAddress 文件所在网络地址
* @功能描述 网络文件下载到服务器本地
*/
@RequestMapping("/netDownloadLocal")
public void downloadNet(String netAddress, String path) throws IOException {
URL url = new URL(netAddress);
URLConnection conn = url.openConnection();
InputStream inputStream = conn.getInputStream();
FileOutputStream fileOutputStream = new FileOutputStream(path);
 
int bytesum = 0;
int byteread;
byte[] buffer = new byte[1024];
while ((byteread = inputStream.read(buffer)) != -1) {
bytesum += byteread;
System.out.println(bytesum);
fileOutputStream.write(buffer, 0, byteread);
}
fileOutputStream.close();
} 

4.下载服务器文件到本地

package com.llp.response;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;
public class FileDownServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       // 1.获取下载文件的路径**
        String realPath="E:\\target\\classes\\ddl.txt";
        System.out.println("下载文件路径"+realPath);
       // 2.下载的文件名
        String fileName=realPath.substring(realPath.lastIndexOf("\\"+1));
       // 3.设置让浏览器支持所下载的文件(设置中文编码utf-8格式)
        resp.setHeader("Content-Disposition", "attachment;filename="+ URLEncoder.encode(fileName, "utf-8"));
       // 4.获取下载文件的输入流
        FileInputStream in= new FileInputStream(realPath);
       // 5.创建缓冲区
        int len=0;
        byte[] buffer=new byte[1024];
        // 6.获取OutputStream对象
        ServletOutputStream out=resp.getOutputStream();
       // 7.将FileOutputStream流写入到buffer缓冲区
       // 8.使用OutputStream将缓冲区中的数据输入到客户端
        while((len=in.read(buffer))>0){
            out.write(buffer,0,len);
        }
        in.close();
        out.close();
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}

 

5. 网络文件获取到服务器后,经服务器处理后响应给前端

/**
* @param netAddress
* @param filename
* @param isOnLine
* @param response
* @功能描述 网络文件获取到服务器后,经服务器处理后响应给前端
*/
@RequestMapping("/netDownLoadNet")
public void netDownLoadNet(String netAddress, String filename, boolean isOnLine, HttpServletResponse response) throws Exception {
 
URL url = new URL(netAddress);
URLConnection conn = url.openConnection();
InputStream inputStream = conn.getInputStream();
 
response.reset();
response.setContentType(conn.getContentType());
if (isOnLine) {
// 在线打开方式 文件名应该编码成UTF-8
response.setHeader("Content-Disposition", "inline; filename=" + URLEncoder.encode(filename, "UTF-8"));
} else {
//纯下载方式 文件名应该编码成UTF-8
response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(filename, "UTF-8"));
}
 
byte[] buffer = new byte[1024];
int len;
OutputStream outputStream = response.getOutputStream();
while ((len = inputStream.read(buffer)) > 0) {
outputStream.write(buffer, 0, len);
}
inputStream.close();
} 

 

 

参考:

https://blog.csdn.net/aaa58962458/article/details/120764754

https://blog.csdn.net/weixin_55491446/article/details/122951047

标签:文件,String,buffer,filename,实例,new,response,服务端,客户端
From: https://www.cnblogs.com/51python/p/17293458.html

相关文章

  • Rabbit-分布式事务实例 20230406
     一、生产、消费者流程        1、生产者(下单后生产务必成功)派单队列:order_platonn_queue交换机:order_exchange_name绑交换机路由键:orderRoutingKey生产者=>采用confirm,确认应答机制Ack模式:成功......
  • 基于 Nginx&Lua 实现自建服务端埋点系统
    前言埋点数据一般取决于服务提供商想从用户身上获取什么信息。通常来讲,主要分为用户的基本属性信息和行为信息。用户的基本属性信息主要包括:年龄、性别、设备等。行为信息即用户的点击行为和浏览行为,在什么时间,哪个用户点击了哪个按钮,浏览了哪个页面,浏览时长等等的数据。基本属......
  • 二次封装ui组件,如何做到属性,作用域插槽以及 实例方法的穿透使用
    A页面:在使用二次封装的组件<MyInputref='inputRef'v-model='data'placeholder='xxxx'><template#prepend>......</template><template#append>......</template></MyInput>......
  • vue第七课:记事本实例
    功能需求:新增生成列表结构获取用户输入回车,新增数据  删除点击删除指定内容(v-onsplice)  splice(index,1) 删除1个对应的索引统计v-text,length  清空数组清空  隐藏没有数据时,隐藏元素(v-if,v-show数组非空)  <divid='app'><inpu......
  • 实例解析
     HTML部分:我们可以使用任何的HTML元素来打开下拉菜单,如:<span>,或a<button>元素。使用容器元素(如:<div>)来创建下拉菜单的内容,并放在任何你想放的位置上。使用<div>元素来包裹这些元素,并使用CSS来设置下拉内容的样式。CSS部分:.dropdown 类使用 position:re......
  • python中的全局变量、实例变量、局部变量、静态变量等
    a=1#全局变量,在模块内、在所有函数外面、在class外面classTest():c=3#静态变量,也可以说类属性,在class内的,但不在class的方法内的deflogin(self):b=2#局部变量,在函数内、在class的方法内(未加self修饰的)self.d=4#实例变量,也可以说实例属性,在class的......
  • vue第五课:图片切换实例
    知识点:1,定义图片数组2,添加图片索引3,绑定src属性4,图片切换逻辑需求:第一张图片不显示上一页(隐藏)最后一张图片不显示下一页(隐藏)<divid='app'><img:src="imgarr[index]"><ahref="#"v-show="index!=0"@click="prev"><imgs......
  • 第二十一篇 离线应用与客户端存储
    bycaixin深圳离线应用支持离线Web应用开发是HTML5的另一个重点。所谓离线Web应用,就是在设备不能上网的情况下仍然可以运行的应用开发离线Web应用需要几个步骤。首先是确保应用知道设备是否能上网,以便下一步执行正确的操作。然后,应用还必须能访问一定的资源(图像、Java......
  • Rust编程语言入门之项目实例:- 命令行程序
    项目实例:-命令行程序一、实例:接收命令行参数本章内容12.1接收命令行参数12.2读取文件12.3重构:改进模块和错误处理12.4使用TDD(测试驱动开发)开发库功能12.5使用环境变量12.6将错误消息写入标准错误而不是标准输出创建项目~/rust➜cargonewminigrepCre......
  • Android MVP 实例
    本文是「吴小龙同学」投稿,MVP其实一直被提及比较多,我的读者们可能有一些人不理解,其实再多的理论比不上一次简单的实践,这篇文章就以一个简单的请求天气功能,来演示AndroidMVP是如何使用的。效果预览准备MVP流程说明:步骤1:UI实现View方法,引用Presenter步骤2:Presenter调用Model,走Model......