java 文件不存在_Java文件流下载并提示文件不存在

做文件下载功能的时候,一般使用流的形式下载文件,

如果源文件不存在,下载页面可能就会没有提示,或者一片空白

用户操作之后可能一头雾水,那如何友好提示呢?

想到的有两种

1.可以尝试下载一个名称为:文件不存在.txt 的文档,里面还可以补充说明信息,保证每次能下载到文件,避免没有响应到用户的情况。

2.后台输出一段JavaScript脚本提示文件不存在或已经被删除。

直接上代码

前端只有给出一个超链接即可

套路得人心.jpg

后端控制器代码

/**

* 下载发票

* @param request

* @return

*/

@RequestMapping(value = "/receipt/download",method = RequestMethod.GET)

public void downloadReceipt(HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException {

// 获得要下载的文件的名称

String fileName = request.getParameter("fileName");

File file = new File(receiptPath + fileName);

if(file.exists()){

try {

String userAgent = request.getHeader("User-Agent");

if (userAgent.contains("MSIE") || userAgent.contains("Trident")) {

//IE浏览器处理

fileName = java.net.URLEncoder.encode(fileName, "UTF-8");

} else {

// 非IE浏览器的处理:

fileName = new String(fileName.getBytes("UTF-8"), "ISO-8859-1");

}

// 以流的形式下载文件。

InputStream inputStream = new BufferedInputStream(new FileInputStream(file));

byte[] buffer = new byte[inputStream.available()];

inputStream.read(buffer);

inputStream.close();

// 清空response

response.reset();

// 设置response的Header

response.addHeader("Content-Disposition", "attachment;filename=" + new String(fileName));

response.addHeader("Content-Length", "" + file.length());

OutputStream outputStream = new BufferedOutputStream(response.getOutputStream());

response.setContentType("application/octet-stream");

outputStream.write(buffer);

outputStream.flush();

outputStream.close();

}catch (IOException ex) {

log.error("下载文件出错:" + ex);

}

}else{

try {

response.setContentType("text/html; charset=UTF-8"); //转码

PrintWriter out = response.getWriter();

out.flush();

out.println("

out.println("alert('文件不存在或已经被删除!');");

out.println("window.location='/AnnualStatistics/downloadList';");

out.println("");

} catch (IOException e) {

log.error("下载文件出错:" + e);

}

}

}

效果

e359b0861e3306bdb55aeb31f1a5054a.png

js 前端实现文件流下载的几种方式

后端是用Java写的一个下载的接口,返回的是文件流,需求:点击,请求,下载 利用iframe实现文件流下载 //把上一次创建的iframe删掉,不然随着下载次数的增多页面上会一堆的iframe var ...

js文件流下载通用方法

通常我们会用到文件流下载文件,下面给大家一个通用的文件流下载的js /* *下载文件 * options:{ * url:'', //下载地址 * isNewWinOpen:false,是否新窗口打开 ...

js实现使用文件流下载csv文件

1. 理解Blob对象 在Blob对象出现之前,在javascript中一直没有比较好的方式处理二进制文件,自从有了Blob了,我们就可以使用它操作二进制数据了.现在我们开始来理解下Bolb对象及它的 ...

文件流下载时 axios blob文件大小不正确?

文件流下载时 js blob文件大小不正确? res.data的字节长度 length blob.size匹配不上.. axio请求里必须修改 responseType: 'blob' 参数, 默认是 ...

【O】VSS 2005上传PDF文件之后,打开提示文件损坏或者内容为空

问题: VSS 2005上传PDF文件之后,打开提示文件损坏或者内容为空: 解决方式: 在vss的客户端的tools-option中,file type选项卡里,在binary file文本框中,加入 ...

win7系统复制文件到u盘提示文件过大怎么办

转载:https://www.xitmi.com/770.html 系统相信很多朋友都遇到过这种情况,在你拷贝文件到u盘时,u盘剩余空间明明很大,但是却复制不进去,电脑提示“对于目标文件系统 文件过大 ...

java 根据Url下载对应的文件到指定位置,读txt文件获取url

package test; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; im ...

Java字符流和字节流对文件操作

记得当初自己刚开始学习Java的时候,对Java的IO流这一块特别不明白,所以写了这篇随笔希望能对刚开始学习Java的人有所帮助,也方便以后自己查询.Java的IO流分为字符流(Reader,Writ ...

Java文件流应用:剪切文件

剪切的实际操作是: 第一步,先复制文件到指定位置, 第二步,删除原文件,这样就实现了剪切 与复制文件相比,多了一步删除文件 注意:删除文件必须在流关闭后,才能删除,否则,删除不了. 实例代码 pack ...

随机推荐

关于ER图和UML图之间的对比

ER图与UML图 ER图:实体-联系图(Entity-Relation Diagram)用来建立数据模型,在数据库系统概论中属于概念设计阶段,ER图提供了表示实体(即数据对象).属性和联系的方法,用来 ...

BZOJ 1863: [Zjoi2006]trouble 皇帝的烦恼( 二分答案 )

二分答案..然后从头到尾推一下, 看最后一个能不能取0个和第一个人相同的勋章 ------------------------------------------------------------- ...

iOS开发之理解iOS中的MVC设计模式

模型-视图-控制器(Model-View-Controller,MVC)是Xerox PARC在20世纪80年代为编程语言Smalltalk-80发明的一种软件设计模式,至今已广泛应用于用户交互应用程 ...

String.getBytes(),源码之下,了无秘密

@Deprecated public void getBytes(int srcBegin, int srcEnd, byte dst[], int dstBegin) { if (srcBegin ...

Vue的组件为什么要export default

Vue 的模块机制 Vue 是通过 webpack 实现的模块化,因此可以使用 import 来引入模块,例如: 此外,你还可以在bulid/webpack.base.conf.js文件中修改相关配置 ...

python自动化运维之路~DAY4

python自动化运维之路~DAY4   作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.模块导入方式详解. 关于Python有几种导入模块的方式,请参考我的另外一篇博客(第20 ...

Flume原理解析【转】

一.Flume简介 flume 作为 cloudera 开发的实时日志收集系统,受到了业界的认可与广泛应用.Flume 初始的发行版本目前被统称为 Flume OG(original generati ...

Leetcode 832.翻转图像

1.题目描述 给定一个二进制矩阵 A,我们想先水平翻转图像,然后反转图像并返回结果. 水平翻转图片就是将图片的每一行都进行翻转,即逆序.例如,水平翻转 [1, 1, 0] 的结果是 [0, 1, 1] ...

meshconverters

https://github.com/RobotLocomotion/meshConverters meshconverters $ mkdir build && cd build $ ...

转: 利用RabbitMQ、MySQL实现超大用户级别的消息在/离线收发

由于RabbitMQ中只有队列(queue)才能存储信息,所以用RabbitMQ实现超大用户级别(百万计)的消息在/离线收发需要对每一个用户创建一个永久队列. 但是RabbitMQ节点内存有限,经测试 ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值