最近项目需要在浏览器中通过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读取文件流,设置浏览器下载或直接预览操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持云海天教程。

原文链接:https://blog.csdn.net/KokJuis/article/details/79576472

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

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

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

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

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

  3. java 无法读取文件_java 读取文件,无法显示文件内容,如何解决? 谢谢。

    从来没见过进行文件读取写入时,在写入中需要随机数的,你读取文件就是从一个地方获取输入流,然后将这个输入流写到别的地方,根本不要随机数. 给你一个示例://copy a file to another  ...

  4. java解析文件_Java读取文件方法大全

    public classReadFromFile {/*** 以字节为单位读取文件,常用于读二进制文件,如图片.声音.影像等文件.*/ public static voidreadFileByByte ...

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

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

  6. java读取系统中指定的文件_java读取jar中指定的文件

    Java 档案 (Java Archive, JAR) 文件是基于 Java 技术的打包方案.它们允许开发人员把所有相关的内容 (.class.图片.声音和支持文件等) 打包到一个单一的文件中.JAR ...

  7. java读取空格_java 读取文件路径空格和中文的处理

    应用部署时,发生文件读取错误,发现是部署路径中含有空格的文件夹名,然后把应用服务器位置迁移了. 从网上找到如下方案: 1, TestURL().class.getResource("&quo ...

  8. java scanner 读取文件_Java读取文本文件

    有很多方法可以在java中读取文本文件.下面我们来逐个看看java中读取文本文件的几个方法. 在java中有很多读取文本文件的方法.文本文件由字符组成,因此可以使用Reader类.在java中读取文本 ...

  9. java io 文件路径_如何从Java项目中的相对路径读取文件? java.io.File找不到指定的路径...

    如何从Java项目中的相对路径读取文件? java.io.File找不到指定的路径 我有一个包含2个包的项目: ListStopWords.txt ListStopWords.txt 在包(2)中我有 ...

最新文章

  1. 融资2.75亿美元的老牌AR公司,倒了
  2. 别顾着学习工作,没了生活
  3. 帝国Cms百度小程序自然搜索之资源删除功能的使用
  4. 老王Python-进阶篇4-面向对象第三节
  5. Cocos2d-x 3.2 异步动态加载 -- 保卫萝卜开发总结
  6. 在Windows Vista中使用符号链接
  7. 浅谈网络通信中的流量整形
  8. iOS 自定义UISlider
  9. 2019-07-10
  10. FFmpeg3.2最新版编译Mediacodec For Android脚本
  11. AUTOCAD参数约束功能
  12. 微星主板Ubuntu16.04安装教程
  13. segy地震数据的读取python_python segy格式地震数据读写包segyio学习笔记(二)
  14. 项目管理十大知识领域之间的关系
  15. IPv6 寻址方式简介
  16. Zebras CodeForces - 950C
  17. 一年节省费用100万,AI导航误差不到1米,杭州奥体“大小莲花”智慧场馆大揭秘...
  18. 微信小程序canva生成图片,长按图片识别小程序二维码详解
  19. URIError: URI malformed
  20. MONTHS_BETWEEN函数使用

热门文章

  1. 基于ARCGIS的VCT扩展模块使用
  2. 程序员工作时用到的“工具”大全
  3. Windows Server 2008最大内存限制
  4. 网易mumu模拟器如何修改hosts文件
  5. dmt,lmt,mssm,assm
  6. 禁用nouveau后黑屏_在Windows中禁用自适应亮度以修复黑屏问题
  7. P123 摩斯密码解密
  8. 当游戏遇到Chrome操作系统
  9. springboot二手车估值与销售网络平台java ssm
  10. [meet in middle 矩阵树定理 容斥原理] SRM 551 div1 SweetFruits