-
2017-08-24 11:40:47
我们可以查看对应的压缩包文件头发现没有了 Content-Length,而多了Transfer-Encoding:chunked , 两个不能同时存在。
说明压缩包经过服务器处理后,不知道大小了,需要动态获取文件大小。
只要我们把 LoadModule deflate_module modules/mod_deflate.so 前面加#注释掉即可。
更多相关内容 -
下载时文件名乱码和文件大小未知的问题(FireFox)
2018-02-20 15:32:36下载文件时文件名乱码和文件大小未知 快速解决文件名乱码 快速解决文件大小未知 完整项目示例 参考资料 下载文件时文件名乱码和文件大小未知 这个问题引发自标准兼容问题 FireFox 对规范要求严格, 而其他浏览器...下载文件时文件名乱码和文件大小未知
这个问题引发自标准兼容问题
FireFox 对规范要求严格, 而其他浏览器相对宽容, 所以其他浏览器会兼容, 而FireFox则不做处理
解决方案是添加Content-Disposition
响应头快速解决文件名乱码
传统 File 类型文件写法( java 1.4 ~ java 6 ):
File file = getFile(); String filename = java.net.URLEncoder.encode(file.getName(), "UTF-8"); response.setHeader("Content-Disposition", "attachment;filename*=utf-8'zh_cn'" + filename);
新IO Path 类型文件写法( java 7 ~ java 13 ):
Path file = Paths.get("E:\\Downloads\\测试文件.pdf"); String filename = file.getFileName().toString(); filename = URLEncoder.encode(filename, StandardCharsets.UTF_8.displayName()); String disposition = "attachment;filename*=utf-8'zh_cn'" + filename; response.addHeader("Content-Disposition", disposition);
重点
重点在这一行:
"attachment;filename*=utf-8'zh_cn'" + filename
在
filename*=utf-8'zh_cn'
后面直接加文件名快速解决文件大小未知
传统IO
File file = new File("E:\\Downloads\\测试文件.pdf"); long fileSize = file .length(); response.setContentLength((int) fileSize);
新IO
Path file = Paths.get("E:\\Downloads\\测试文件.pdf"); long fileSize = Files.size(file); response.setContentLength((int) fileSize);
重点
给 response 设置
Content-Length
头就可以解决这个问题response.setContentLength((int) fileSize);
完整类代码
package cc.momas; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; /** * @author Sod-Momas * @since 2020.01.16 **/ @WebServlet(value = "/download") public class DownloadServlet extends HttpServlet { @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 解决乱码,一般写在过滤器 filter里 request.setCharacterEncoding(StandardCharsets.UTF_8.displayName()); response.setCharacterEncoding(StandardCharsets.UTF_8.displayName()); response.setContentType("text/html;charset=utf-8"); // 获取文件 Path file = Paths.get("E:\\Downloads\\测试文件.pdf"); // 检测文件是否存在 if (Files.notExists(file)) { response.getWriter().write("指定文件不存在:" + file.toAbsolutePath()); return; } // 获取文件名 String filename = file.getFileName().toString(); // 获取文件大小,单位是byte long fileSize = Files.size(file); // 将文件名URL编码 filename = URLEncoder.encode(filename, StandardCharsets.UTF_8.displayName()); // 添加触发下载的前缀 // 规范参考 : Content-Disposition https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Content-Disposition String disposition = "attachment;filename*=utf-8'zh_cn'" + filename; // 添加 Content-Disposition 告诉浏览器数据展现的方式是附件下载,并且提供文件名 response.addHeader("Content-Disposition", disposition); // 添加 Content-Length 告诉浏览器数据的长度,单位是 byte response.setContentLength((int) fileSize); // 添加 Content-Type 告诉浏览器这是一个二进制流 response.setContentType("application/octet-stream"); // 把文件从本地复制到 response 输出流输出给前端 Files.copy(file, response.getOutputStream()); } }
完整项目示例
请访问我的码云仓库获取最新代码:
https://gitee.com/Sod-Momas/servlet-download-example
参考资料
博客
MDN
- Content-Disposition
Content-Disposition
响应头的作用 - Content-Type Content-Type 实体头的作用
- Content-Length Content-Length 是一个实体消息首部,用来指明发送给接收方的消息主体的大小,即用十进制数字表示的八位元组的数目。
RFC
- Media Types 不同文件的 MIME Types
- octet-stream - Media Type octet-stream 类型的规范
- Content-Disposition
-
使用Java通过HTTP未知长度下载文件
2021-02-28 17:05:01这应该工作,我测试它,它适用于我:void downloadFromUrl(URL url, String localFilename) throws IOException {InputStream is = null;FileOutputStream fos = null;try {URLConnection urlConn = url.open...这应该工作,我测试它,它适用于我:
void downloadFromUrl(URL url, String localFilename) throws IOException {
InputStream is = null;
FileOutputStream fos = null;
try {
URLConnection urlConn = url.openConnection();//connect
is = urlConn.getInputStream(); //get connection inputstream
fos = new FileOutputStream(localFilename); //open outputstream to local file
byte[] buffer = new byte[4096]; //declare 4KB buffer
int len;
//while we have availble data, continue downloading and storing to local file
while ((len = is.read(buffer)) > 0) {
fos.write(buffer, 0, len);
}
} finally {
try {
if (is != null) {
is.close();
}
} finally {
if (fos != null) {
fos.close();
}
}
}
}
如果你想让它在后台运行,只需在一个线程中调用它:
Thread download = new Thread(){
public void run(){
URL url= new URL("http://overpass-api.de/api/interpreter?data=area%5Bname%3D%22Hoogstade%22%5D%3B%0A%28%0A++node%28area%29%3B%0A++%3C%3B%0A%29+%3B%0Aout+meta+qt%3B");
String localFilename="mylocalfile"; //needs to be replaced with local file path
downloadFromUrl(url, localFilename);
}
};
download.start();//start the thread
-
java写的文件下载接口,客户端无法获取到文件大小问题
2020-05-11 13:05:56直接上代码: // 字符串转InputStream byte[] manifestPlistBytes = manifestPlistStr.getBytes("UTF-8"); InputStream input = new ByteArrayInputStream(manifestPlistBytes); String filename = System....直接上代码:
// 字符串转InputStream byte[] manifestPlistBytes = manifestPlistStr.getBytes("UTF-8"); InputStream input = new ByteArrayInputStream(manifestPlistBytes); String filename = System.currentTimeMillis() + "manifest.plist"; int len = 0; byte[] bytes = new byte[1024]; ServletOutputStream servletOutputStream = resp.getOutputStream(); resp.setContentType("application/octet-stream"); resp.setHeader("Accept-Ranges", "bytes"); resp.setHeader("Content-Length", String.valueOf(manifestPlistBytes.length)); resp.setHeader("Content-Disposition", "attachment; filename=" + filename); resp.setCharacterEncoding("UTF-8"); while ((len = input.read(bytes)) > 0) { servletOutputStream.write(bytes, 0, len); } servletOutputStream.close(); input.close();
关键代码:
resp.setHeader("Accept-Ranges", "bytes");
resp.setHeader("Content-Length", String.valueOf(manifestPlistBytes.length));参考网上资料和jfinal源码。
-
"这个压缩文件格式未知或者数据已经被损坏"解决方法
2021-04-21 13:18:01"这个压缩文件格式未知或者数据已经被损坏"解决方法1.如果是从网上下载的压缩文件,很有可能是网站提供的本身就是损坏的压缩文件。如果重新下载之后仍然是损坏的,可以从其他网站下载。2.尝试使用WinRAR软件自身的... -
PHP下载文件并显示进度条
2021-04-10 14:43:34下载进度条演示文件大小未知长度已经下载0完成进度0%//文件长度var filesize=0;function $(obj) {return document.getElementById(obj);}//设置文件长度function setFileSize(fsize) {filesize=fsize;$("filesize").... -
zblog上传文件出现未知错误 大小不能超过200k【解决】
2020-12-22 10:48:28今天发布文章时,在上传图片的时候出现了一个错误,错误信息是“错误原因:未知错误”。zblog上传文件失败一开始我以为是图片格式不对,仔细看了之后,确实是jpg文件,一向都没有问题的。随后我又随便找了一张jpg的... -
我的电脑本地磁盘图标显示为未知图标怎么回事?如何解决?
2021-07-11 03:01:24很多朋友都会遇到这样的情况,打开"我的电脑",本地磁盘图标显示为未知图标,这是怎么回事?能解决吗?相信很多小白电脑的人都不知道怎么做。下面小编就为大家解决方法,确实很有效,希望对大家有所帮助!可能原因:... -
vue blob流下载zip文件,下载后包文件显示文件损坏
2020-09-04 10:30:42今天遇到一个问题,就是下载的zip文件打不开,一直显示文件被损坏。 本来觉得是后端的问题,但是排除了好久,确实没有问题,postman也实验成功。 后来发现系统main.js中引入了mock数据,影响了axios请求,造成了... -
未知命令casstoolbox
2020-12-20 05:56:57技术文档主体内容:可以认为是页面最想表达的内容总和。对于内容详情页来说,主体内容指从标题开始至正文内容结束,翻页区域也被视为主体内容,文章后的评论、分享、推荐等不视为主体内容。首屏:用户点击搜索结果后... -
Android版本升级下载Apk文件通知栏显示,进度条显示,自定义圆环显示,下载完成自动安装
2022-04-02 15:13:00如果点确定升级,就访问服务器上返回–下载地址的url(okhttp,DownloadManager),下载的进度条显示方式通知栏、弹窗进度条百分比、自定义圆环显示。 一、下载Apk的两种方式(okhttp,DownloadManager) 1.Download... -
磁盘未知,未初始化或未分配问题的解决方案
2021-07-11 03:00:20当进入Window的磁盘管理实用程序,发现磁盘是未知的,未初始化的,未分配的,那么如何修复未初始化的磁盘?还有丢失数据之后怎么找回?”第1部分:初始化磁盘意味着什么?初始化存储设备(非常类似于格式化过程)是一... -
硬盘图标显示异常的解决办法
2021-07-28 08:19:58首先让电脑的隐藏文件全部显示(具体方法看文章最后),在对电脑的检查过程中小编发现硬盘里有隐藏文件名为autorun.inf,这是一个双击磁盘会自动运行制定某个文件的程序,将其全部删除之后在重新打开我的电脑,发现... -
【数据库】解决:sql文件导入MYSQL出现未知的问题
2021-09-28 17:17:40MYSQL导入SQL文件失败的解决方案1、sql文件导入MYSQL出现未知的问题2、解决方法2.1、修改配置文件2.2、在cmd中进行导入 1、sql文件导入MYSQL出现未知的问题 2、解决方法 2.1、修改配置文件 mysql根据配置文件会... -
java上传并下载以及解压zip文件有时会报文件被损坏错误分析以及解决
2021-02-12 23:08:104.将下载的zip文件解压到本地(文件大小超过50KB时报文件被损坏);分析:既然报文件被损坏,肯定就是因为下载文件时文件没有读取完全。程序肯定不会骗人,但是当时在解决这个问题的时候,就是不愿意相信是下载的问题,... -
电脑提示未知发布者 - 卡饭网
2020-12-21 08:14:25IE浏览器提示未知发布者安全警告怎么办IE浏览器提示未知发布者安全警告怎么办 IE浏览器提示未知发布者安全警告的解决方法, IE浏览器提示未知发布者怎么办?安下小编就来分析一下. 1.打开IE浏览器,从右上角打开... -
java response输出文件流
2021-02-26 15:15:031、设置ContentTyperesponse....2、设置文件名,并指定编码格式fileName = URLEncoder.encode("浏览器要显示的文件名", "UTF-8");response.setCharacterEncoding("UTF-8");3、将文件名addHeaderresponse.addHe... -
JavaWeb 如何从FTP服务器下载文件 页面如何获取到FTP服务器上的图片进行显示
2018-08-12 10:44:35前几天,写了一篇关于如何上传图片保存至FTP服务器的文章,今天继续把上传到FTP服务器的图片下载下来,在页面中进行显示。也就是满足了我们日常代码demo中,页面需要动态加载的图片的实例的实现。(不再需要手动把... -
Win7系统桌面图标显示异常变未知白色图标解决方法大全
2021-07-28 06:09:55近日有用户使用的win7操作系统发现桌面图标变异常,桌面软件图标都变得白色或未知图标(如下图所示),导致无法正常打开软件程序,出现这种现象很有可能是桌面图标缓存出现问题,下面是豆豆整理的各种纠结方法,如果... -
如何解决:微云下载文件总是下载失败
2019-07-25 17:09:13同事用腾讯微云把照片传给我,但是我死活下载不下来,总是突然停止,然后提示——未知大小,下载失败。 用过的方法 在网页版上下载——出现问题:总是突然停止,提示“未知大小,下载失败” 让朋友先保存文件,再把... -
mount:未知的文件系统类型“exfat“ 问题思考与解决
2020-07-03 14:09:24CentOS7,打算当自己平时练手用的服务器,今天拿了自己的移动硬盘,想把之前的东西拷过去,但是 mount 的时候发现 mount 不上去(我的是 exFat 格式的也就是 fat64,支持 macOS和 Windows 的文件互传)。 思考 那 ... -
c++ 读取文件夹下的所有文件名(实现未知文件名也可以批量读取文件)
2017-08-19 09:50:40总计有以下以下9种:文件的标题名、文件的属性(只读、存档,隐藏等)、文件的创建时间、文件的最后访问时间、文件的最后修改时间、文件大小的高位双字、文件大小的低位双字、保留、保留。在这里只有文件标题名和... -
springboot 项目实现文件上传,显示,下载,打包为jar
2020-04-08 22:21:30文件的上传和显示操作比较简单。另外就是在文件上传到项目路径的静态资源文件夹resources/下。还可以上传到mongodb中。 这次使用Springboot提供了的静态资源的映射方式 你可以添加一个外部文件夹并将其作为一个... -
Python爬取图片显示似乎不支持此文件格式
2020-10-28 10:41:40在学习Python爬虫时,模仿demo自己写一遍的时候,发现保存到文件的图片点开后显示似乎不支持此文件格式,一开始以为是正则没写对,然后查看图片的大小后发现只有80多k,检查后发现问题如下: 出现的错误: 原因是... -
XFTP上传文件时出现上传错误(未知错误)
2019-08-30 10:14:57记录一下自己在工作中用到XFTP上传文件到服务器(JAR包上传构建测试环境)时出现的问题: 起因:前两天构建环境上传文件还...排除软件问题,上传其他文件(excel小文档)上传出现0KB错误情况,同样无法上传,排除上... -
java+大文件上传下载
2019-08-26 11:26:20文件上传下载,与传统的方式不同,这里能够上传和下载10G以上的文件。而且支持断点续传。 通常情况下,我们在网站上面下载的时候都是单个文件下载,但是在实际的业务场景中,我们经常会遇到客户需要批量下载的场景... -
基于Apache服务器的文件列表,即文件的http下载模式
2017-08-24 10:48:18很早之前,就看到过很多网站,除了本身某个地址可以显示html网页之外,其他有些网站路径下面的子路径: ... 就像本地电脑中的子文件夹一样,可以以列表形式显示文件: -
Linux 文件管理:Linux gzip 压缩
2021-05-10 05:52:20Gzip (GNU zip) 是一个压缩工具,用于减少文件大小。默认原始文件被替换成压缩文件并以后缀名为 .gz 结尾的文件。解压缩文件使用 gunzip 命令,恢复原始文件。语法:gzip...gunzip...举例:$ gzipfile1.txtfile2.txt... -
文件上传(显示进度条、上传速度)
2020-04-01 23:00:51在以下情况中,请使用 POST 请求: 无法使用缓存文件(更新服务器上的文件或数据库) 向服务器发送大量数据(POST 没有数据量限制) 发送包含未知字符的用户输入时,POST 比 GET 更稳定也更可靠 FormData对象 使用... -
Asp.Net下载文件时中途失败问题
2019-09-20 18:01:41浏览器与服务器建立连接后,通过Asp.Net...,以此告诉浏览器待下载文件大小,这样浏览器就知道它要下载的文件有多大了,利用这个参照值来避免因文件大小未知而导致中途下载失败。 转载于:https://www.cnblogs.co...