文件下载,通过<a href="url">也是可以的,但是这样直接下载,一般文件名就是服务器端的没有任何意义的文件名。

今天自己用到了另外一种,先说需求:1.文件服务器与系统没有在同一服务器,所以需要使用网络地址来进行下载;

2.上传时为了避免文件重名,使用uuid来生成了文件名,真实的文件名存与数据库中;

3.所有的文件都只能下载,不可直接在浏览器上打开。

根据代码来分析:这里使用的boot

  • 方案一:要么在浏览器通过js下载文件后再修改名称给用户下载,参考:纯js实现文件下载并重命名功能
  • 方案二:要么在java后端把文件下载回来,然后通过resonse返回浏览器下载
    @ResponseBody@RequestMapping(value = "/downloadFile")public void downloadRename(@RequestParam(name = "url") String url,@RequestParam(name = "fileName") String fileName,HttpServletResponse response){Assert.isTrue(!StringUtils.isEmpty(fileName),"文件名不能为空,请确认!");try{//获取要下载的文件
//            HttpResponse httpResponse = HttpUtils.executeHttpGet(url);ResponseEntity<Resource> entity = customRestTemplate.getForEntity(url, Resource.class);File myfile = new File(url);if(entity.getStatusCode() == HttpStatus.OK){response.setCharacterEncoding("utf-8");String contentType = entity.getHeaders().get("Content-Type").get(0);response.setContentType(contentType);
//                response.setContentType("application/octet-stream");String suffix = myfile.getName().substring(myfile.getName().indexOf("."));//设置文件名称response.setHeader("Content-Disposition",String.format("attachment;fileName=%s%s", (new String(fileName.getBytes("utf-8"), "ISO8859-1")),suffix) );//ResponseEntity<Resource> entity.getBody().getInputStream()//把文件的字节流写到response的outputStream里StreamUtils.copy(entity.getBody().getInputStream(),response.getOutputStream());response.getOutputStream().flush();}}catch (Exception e){log.error("rename error,{}",e);}finally{try {//必须关闭流,否则下载的文件会提示网络失败response.getOutputStream().close();} catch (IOException e) {log.error("getOutputStream close error,{}",e);}}}
    //ResponseEntity的返回方式是直接返回二进制的字节流给浏览器,不用原来的response//服务器控制浏览器发下载方式打开文件,弊端就是失败时没有办法返回json@RequestMapping(value = "/download")public ResponseEntity<byte[]> download(@RequestParam("url") String url,@RequestParam("fileName") String fileName,HttpServletResponse response){try{//获取要下载的文件HttpResponse httpResponse = HttpUtil.executeHttpGet(url);if(httpResponse.getStatusLine().getStatusCode() == 200){HttpHeaders headers = null;ByteArrayOutputStream baos=null;headers = new HttpHeaders();//设置文件名称,服务器控制浏览器发下载方式打开文件,例:Content-Disposition: attachment; filename=aaa.jpgheaders.setContentDispositionFormData("attachment",new String(fileName.getBytes("UTF-8"), "iso-8859-1"));headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);baos = new ByteArrayOutputStream();StreamUtils.copy(httpResponse.getEntity().getContent(),baos);//直接返回二进制的字节流的response实体return new ResponseEntity<byte[]>(baos.toByteArray(), headers, HttpStatus.CREATED);}}catch (Exception e){e.printStackTrace();}return null;}

HttpUtil工具

public static HttpResponse executeHttpGet(String url) {HttpParams httpParameters = null;HttpClient client = null;HttpGet request = null;try {httpParameters = new BasicHttpParams();HttpConnectionParams.setConnectionTimeout(httpParameters,timeoutConnection);HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);client = new DefaultHttpClient(httpParameters);request = new HttpGet();request.setURI(new URI(url));HttpResponse response = client.execute(request);return response;} catch (Exception e) {e.printStackTrace();//LogUtils.e(TAG_TAG, "executeHttpGet: error=" + e.toString(), e);return null;} finally {httpParameters = null;client = null;request = null;}}

另此方案为springmvc

@RequestMapping("/download")public String downloadAmachment(String downloadUrl, String realFileName, HttpServletRequest request,HttpServletResponse response) {response.setContentType("text/html;charset=UTF-8");try {request.setCharacterEncoding("UTF-8");BufferedInputStream bis = null;BufferedOutputStream bos = null;//此处使用的配置文件里面取出的文件服务器地址,拼凑成完整的文件服务器上的文件路径//写demo时,可以直接写成http://xxx/xx/xx.txt.这种形式String downLoadPath = ConfigHelper.getString("img.server.url") + downloadUrl;response.setContentType("application/octet-stream");response.reset();//清除response中的缓存//根据网络文件地址创建URLURL url = new URL(downLoadPath);//获取此路径的连接URLConnection conn = url.openConnection();Long fileLength = conn.getContentLengthLong();//获取文件大小//设置reponse响应头,真实文件名重命名,就是在这里设置,设置编码response.setHeader("Content-disposition","attachment; filename=" + new String(realFileName.getBytes("utf-8"), "ISO8859-1"));response.setHeader("Content-Length", String.valueOf(fileLength));bis = new BufferedInputStream(conn.getInputStream());//构造读取流bos = new BufferedOutputStream(response.getOutputStream());//构造输出流byte[] buff = new byte[1024];int bytesRead;//每次读取缓存大小的流,写到输出流while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {bos.write(buff, 0, bytesRead);}response.flushBuffer();//将所有的读取的流返回给客户端bis.close();bos.close();} catch (IOException e) {LOG.error(e.getMessage(), e);return ErrorPages._500;}return null;}

SpringBoot下载网络文件并重命名,比如:excel相关推荐

  1. java修改网络上的文件_java下载网络文件并重命名

    文件下载,通过也是可以的,但是这样直接下载,一般文件名就是服务器端的没有任何意义的文件名. 今天自己用到了另外一种,先说需求:1.文件服务器与系统没有在同一服务器,所以需要使用网络地址来进行下载: 2 ...

  2. php下载文件并重命名,通过php下载文件并重命名

    通过php下载文件并重命名 $filename = dirname(__FILE__) . '/oldfilename.jpg'; $out_filename = 'newfilename.jpg'; ...

  3. [工具库]JFileDownloader工具类——多线程下载网络文件,并保存在本地

    本人大四即将毕业的准程序员(JavaSE.JavaEE.android等)一枚,小项目也做过一点,于是乎一时兴起就写了一些工具. 我会在本博客中陆续发布一些平时可能会用到的工具. 代码质量可能不是很好 ...

  4. wget命令——下载网络文件

    wget命令是英文词组"web get"的缩写,用于从指定网址下载网络文件. wget命令支持如HTTP.HTTPS.FTP等常见协议,可以在命令行中直接下载网络文件. 与curl ...

  5. Linux命令06 - - wget 下载网络文件

    wget命令支持如HTTP.HTTPS.FTP等常见协议,可以在命令行中直接下载网络文件. web get缩写 wget 官网:http://www.gnu.org/software/wget/ wg ...

  6. 复制指定目录后缀文件并重命名

    复制指定目录后缀文件并重命名 背景: 最近有一个套网络课程,需要听的mp3是按照日期做文件夹,存放到阿里云难找并且会乱序.打算find+cp把文MP3文件都找出来,并按照序号+文件夹名+文件名顺序命名 ...

  7. scp 保留文件属组_scp 对拷文件夹 和 文件夹下的所有文件 对拷文件并重命名

    对拷文件夹 (包括文件夹本身) scp -r   /home/wwwroot/www/charts/util root@192.168.1.65:/home/wwwroot/limesurvey_ba ...

  8. Springboot下载word文件无法打开

    Springboot下载word文件无法打开 错误 话不多说直接上代码,正确word下载方式 import org.apache.poi.openxml4j.opc.OPCPackage; impor ...

  9. python复制文件到另一个文件夹并重命名_基于python实现复制文件并重命名

    方法: shutil.copy("c://ccc//模板.xlsx","c://ccc//新文件.xlsx") 需求: 已知的Excel模板格式.已知的文件命名 ...

最新文章

  1. pytorch Spawning 子线程
  2. Java、Python、JS、C语言,哪个更值得学?
  3. 100万并发连接服务器笔记之测试端就绪
  4. 智慧消防、消防管理、事件管理、维保巡检、应急管理、培训管理、值班管理、考试管理、设备列表、机构管理、应急预案、axure原型、rp原型
  5. CNN————激活可能性小的神经元不代表这个神经元的用处小
  6. Android仿人人客户端(v5.7.1)——新鲜事之下拉列表(过滤项列表)
  7. P3211 [HNOI2011]XOR和路径
  8. Spring依赖注入的三种方式
  9. C语言程序设计第五版谭浩强课后答案 第六章习题答案
  10. 云计算开发一般负责什么工作呢?云计算是做什么的?
  11. 数据库基础知识(1)--数据库php连接
  12. 抽屉新热榜html源码,利用scrapy获取抽屉新热榜的标题和内容以及新闻地址保存到本地...
  13. 分享一个插件-水珠自动下落效果
  14. build_ext --inplace 是什么意思
  15. 水面垃圾收集器在线监测项目案例
  16. 上帝 谭卓 马加爵等人的对话
  17. 剑指offer T46把数字翻译成字符串
  18. 【RTX操作系统教程】第3章 初学RTX操作系统准备工作
  19. Flappy Bird 一款C语言小游戏(图形优化版)(成功解决EasyX中putimage()未能实现第二张图片显示问题)
  20. fastreport.net使用部分总结和c#相关代码

热门文章

  1. Linux ssh多个端口开启
  2. Networkx笔记:获取list类型的节点列表
  3. I.MX RT1050 通过修改DCD文件修改SDRAM参数
  4. 陈宝仪(Redis-replicator作者)详解Redis协议,今晚直播
  5. Android学习笔记五—简易新闻应用设计
  6. PPT演讲的准备工作
  7. 测试:你是哪一种人才?
  8. Modbus学习记录
  9. VHDL语言的基本单元(实体和结构体)
  10. matlab chebyshev插值,Matlab之插值