最近项目需要在浏览器中通过URL预览图片。但发现浏览器始终默认下载,而不是预览。研究了一下,发现了问题:

// 设置response的Header,注意这句,如果开启,默认浏览器会进行下载操作,如果注释掉,浏览器会默认预览。 response.addHeader("Content-Disposition", "attachment;filename=" + FileUtil.getOriginalFilename(path));

然后需要注意:

response.setContentType(contentType);//不同的文件类型,contentType不一样,比如图片一般是image/jpeg、image/png等

@RequestMapping(value = "getFile/{folder}/{fileName:.+}*", method = RequestMethod.GET)

public void getFile(HttpServletResponse response, @PathVariable String folder,

@PathVariable String fileName)

{

// 设置编码

response.setCharacterEncoding("UTF-8");

try

{

String path = folder + "/" + fileName;

boolean flag = ossClient.doesObjectExist(ossProperties.getBucket(), path);

// 判断文件是否存在

if (flag)

{

// 清空response

response.reset();

// 设置response的Header,注意这句,如果开启,默认浏览器会进行下载操作,如果注释掉,浏览器会默认预览。

// response.addHeader("Content-Disposition",

// "attachment;filename=" + FileUtil.getOriginalFilename(path));

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

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

// ByteArrayOutputStream bos = new ByteArrayOutputStream(1024);

OSSObject ossObject = ossClient.getObject(ossProperties.getBucket(), path);

String contentType = ossObject.getObjectMetadata().getContentType();

System.out.println(contentType);

//注意contentType类型

response.setContentType(contentType);

byte[] buf = new byte[1024];

InputStream in = ossObject.getObjectContent();

int L;

while ((L = in.read(buf)) != -1)

{

// if (buf.length != 0)

// {

toClient.write(buf, 0, L);

// }

}

in.close();

// 写完以后关闭文件流

toClient.flush();

toClient.close();

// response.getOutputStream().write(bos.toByteArray());

}

else

{

response.sendError(HttpServletResponse.SC_NOT_FOUND, "找不到相关资源");

}

}

catch (IOException e)

{

e.printStackTrace();

}

}

补充知识:【Java文件下载】如何让浏览器直接下载后端返回的图片,而不是直接打开

默认情况下,浏览器设定是inline形式,对于服务器返回的文件,能打开就打开,不能打开就自动下载。

Content-Disposition 设置

大多数情况下,后端都是实现一个文件管理的功能,通过文件的唯一标志去获取文件流。后端都会读取文件,然后文件的流写入到response的输出流,这样就可以实现文件的访问了。

但是有些时候,实现下载功能,后端返回的是图片,浏览器却直接把图片打开了?怎么回事?

这就是Content-Disposition设置的问题,如下都是java示例:

设置为inline,如果浏览器支持该文件类型的预览,就会打开,而不是下载:

response.setHeader("Content-Disposition", "inline; filename=111.jpg");

设置为attachment,浏览器则直接进行下载,纵使他能够预览该类型的文件。

response.setHeader("Content-Disposition", "attachment; filename=111.jpg");

特别说明:Chrome不设置Content-Type也会自动打开,如果是它可识别预览的文件。

示例代码

package cn.hanquan.controller;

import java.io.File;

import java.io.IOException;

import javax.servlet.ServletOutputStream;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.apache.commons.io.FileUtils;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.servlet.ModelAndView;

@Controller

public class DemoDownload {

@RequestMapping("download")

public void download(String filename, HttpServletResponse res, HttpServletRequest req) throws IOException {

// 设置响应流中文件进行下载

// attachment是以附件的形式下载,inline是浏览器打开

// bbb.txt是下载时显示的文件名

// res.setHeader("Content-Disposition", "attachment;filename=bbb.txt"); // 下载

res.setHeader("Content-Disposition", "inline;filename=bbb.txt"); // 浏览器打开

// 把二进制流放入到响应体中

ServletOutputStream os = res.getOutputStream();

System.out.println("here download");

String path = req.getServletContext().getRealPath("files");

System.out.println("path is: " + path);

System.out.println("fileName is: " + filename);

File file = new File(path, filename);

byte[] bytes = FileUtils.readFileToByteArray(file);

os.write(bytes);

os.flush();

os.close();

}

}

浏览器直接打开效果

下载效果

以上这篇JAVA读取文件流,设置浏览器下载或直接预览操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持聚米学院。

java 读取浏览器_JAVA读取文件流,设置浏览器下载或直接预览操作相关推荐

  1. java图片预览上传_java实现文件上传、下载、图片预览

    这篇文章主要介绍了java实现文件上传.下载.图片预览,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 多文件保存到本地: @ResponseBody ...

  2. java 看书浏览器官_JAVA读取文件流,设置浏览器下载或直接预览操作

    最近项目需要在浏览器中通过url预览图片.但发现浏览器始终默认下载,而不是预览.研究了一下,发现了问题: // 设置response的header,注意这句,如果开启,默认浏览器会进行下载操作,如果注 ...

  3. java用浏览器下载文件_JAVA读取文件流,设置浏览器下载或直接预览操作

    最近项目需要在浏览器中通过url预览图片.但发现浏览器始终默认下载,而不是预览.研究了一下,发现了问题: // 设置response的header,注意这句,如果开启,默认浏览器会进行下载操作,如果注 ...

  4. java浏览器预览文件_JAVA读取文件流,设置浏览器下载或直接预览操作

    最近项目需要在浏览器中通过URL预览图片.但发现浏览器始终默认下载,而不是预览.研究了一下,发现了问题: // 设置response的Header,注意这句,如果开启,默认浏览器会进行下载操作,如果注 ...

  5. JAVA 实现返回PDF文件流并进行下载

    JAVA 实现返回PDF文件流并进行下载 首先确保本地存放pdf 保证通过路径可以拿到文件 我这边把pdf放在e盘下的目录 1.前台方法 原生ajax 发送请求返回文件流进行下载 function d ...

  6. ashx获取input file 文件_前端战五渣学前端——FileReader预览本地文件

    距离上一篇博客将近一个半月了,这一个多月有点烦躁,静不下心来学习,也不知道为什么,玩的也不算太好,还感冒.可能是天气热了吧,有点点躁动.上周看了<哪吒--魔童降世>还不错,还看了新出的&l ...

  7. 阿里云oss上传svg等格式的文件,返回的路径打开后是下载而不是预览

    在做的一个项目,阿里云oss上传svg等格式的文件,返回的路径打开后是下载而不是预览.之后web同事跟产品说不好处理,换回了使用jpg格式的文件.但是最终这个问题都是要解决的,产品要求下期也要上传sv ...

  8. 处理pdf文件直接下载,不预览

    ***## 出现文件跨域下载问题 https 域名与http 文件 处理方案**(把图片 http 更换为https)* const toUrl = filePath.split('://')[1] ...

  9. java properties读取 封装_java properties 文件读取踩坑记

    当然,读取不到配置文件,是线上和开发环境结果不同这种情况.开发线下环境,明明读取正常,一放到线上,杯具了,没读取到. 然后呢?当然是看看线上这个目录下有没有这个文件,ftp上去一看,文件有啊,目录也对 ...

最新文章

  1. python检查_python设置检查点简单实现
  2. 一款不错的基于WEB技术的文件服务器
  3. Apache+Tomcat+Mysql+php整合jsp,php
  4. Syn Bot /OSCOVA 上下文(8)
  5. 舞蹈里需要用计算机的地方,【舞蹈教学论文】计算机多媒体技术在舞蹈教学中的应用(共2080字)...
  6. Linux-sed文本处理流编辑器
  7. 首付贷换了马甲,又重现江湖了
  8. 一个简单的静态web服务器
  9. python selenium自动化框架_一文讲透!实现一个Python+Selenium的自动化测试框架如此简单!...
  10. nginx反向代理异常
  11. SYN-COOKIE
  12. 奈奎斯特稳定性判据的步骤(含详细推导)
  13. 制造车间怎么推行5S管理?
  14. JAVA招聘管理系统计算机毕业设计Mybatis+系统+数据库+调试部署
  15. 應用程式中發生伺服器錯誤
  16. 管理必备认知--员工素质模型:能愿知模型
  17. 冒泡php_PHP实现冒泡排序
  18. 有一个已排好序的数组,要求输入一个数后,按原来排序的规律将它插入数组中——C语言
  19. 怎么用注册表来删除卸载程序
  20. html5限制拖拽区域怎么实现,html5怎么实现拖拽

热门文章

  1. html5水涟漪动画,CSS3水波涟漪动画定位样式制作教程
  2. [Style Transfer]—Combining Markov Random Fields and Convolutional Neural Network for Image Synthesis
  3. Linux防火墙关闭方法
  4. 使用Jmeter做性能测试
  5. 基于STM32使用PWM调速控制直流电机
  6. 教你用 Python 快速批量转换 HEIC 文件
  7. unity3d 模型从上到下出现(shader)
  8. 将你的 Python 脚本转换为命令行程序
  9. SpyNote的APK无法运行的问题
  10. i58250u是低端处理器吗_玩都市天际线要很大的显卡吗