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

最近项目需要在浏览器中通过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();

}

}

浏览器直接打开效果

a5a90003e4f1519d71216cdb36c6e530.png

下载效果

61c300285a066e11c258cc11baaf9a9d.png

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

希望与广大网友互动??

点此进行留言吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/541425.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java PriorityQueue poll()方法与示例

PriorityQueue类poll()方法 (PriorityQueue Class poll() method) poll() method is available in java.util package. poll()方法在java.util包中可用。 poll() method is used to return the first element with removing an element from this PriorityQueue. poll()方法用于…

scrapy抓取淘宝女郎

scrapy抓取淘宝女郎 准备工作 首先在淘宝女郎的首页这里查看,当然想要爬取更多的话,当然这里要查看翻页的url,不过这操蛋的地方就是这里的翻页是使用javascript加载的,这个就有点尴尬了,找了好久没有找到,这里如果有朋…

map在Java集合_java集合之Map

MapMap用于保存具有映射关系的数据。Map中key不允许重复,value可以重复,key和value之间存在单向一对一关系HashMap和Hashtable区别1 Hashtable线程安全、HashMap线程不安全,所以HashMap性能高一点2 Hashtable不允许用null做key和value&#x…

Java OutputStream close()方法与示例

OutputStream类close()方法 (OutputStream Class close() method) close() method is available in java.io package. close()方法在java.io包中可用。 close() method is used to close this OutputStream stream and free all system resources linked with this stream and …

怎样在fastboot 里面加入新的命令

fastboot 是android 默认的一种debug 方法。它的优点是在进入linux kernel 之前就可以操作。默认fastboot 支持的命令&#xff1a; usage: fastboot [ <option> ] <command>commands: update <filename> reflash device …

java编写字符串连接程序注释_Java 注解自动化处理对应关系实现注释代码化

public class EsQuery { private static int DEFAULT_SIZE 100; private final Map termFilter;private final Map rangeFilter;private final Map matchFilter;private int size;private String orderBy null;private String order null; // query 查询语法, 是否需要 filtere…

getlanguage_Java语言环境getLanguage()方法与示例

getlanguage区域设置类getLanguage()方法 (Locale Class getLanguage() method) getLanguage() method is available in java.util package. getLanguage()方法在java.util包中可用。 getLanguage() method is used to retrieve this Locale language code and the language co…

[转]Anaconda

安装 Anaconda Anaconda 可用于 Windows、Mac OS X 和 Linux。可以在 https://www.continuum.io/down... 上找到安装程序和安装说明。 如果计算机上已经安装了 Python&#xff0c;这不会有任何影响。实际上&#xff0c;脚本和程序使用的默认 Python 是 Anaconda 附带的 Python。…

win10 iot core java_Windows 10 IoT Core 正式版初体验

今天收到Windows 10 IoT Core Team邮件&#xff0c;Windows 10 IoT Core正式发布。以下记录了今天在Raspberry Pi 2上的体验过程&#xff1a;准备工作一台运行着正版Windows 10且版本不小于10240的个人PCVisual Studio 2015 版本不小于14.0.23107.0 D14Rel Install Visual Stud…

filterwriter_Java FilterWriter flush()方法与示例

filterwriterFilterWriter类flush()方法 (FilterWriter Class flush() method) flush() method is available in java.io package. flush()方法在java.io包中可用。 flush() method is used to flush out the string from this FilterWriter stream. flush()方法用于从此Filter…

VUE2 第五天学习--过渡效果

阅读目录 1.理解VUE---过渡效果回到顶部1.理解VUE---过渡效果 1. 过渡的-css-类名会有4个(css) 类名在 enter/leave 在过渡中切换。1. v-enter: 进入过渡的开始状态。在元素被插入时生效&#xff0c;在下一个帧移除。2. v-enter-active: 进入过渡的结束状态。在元素被插入时生效…

java 集合addall_Java集合的addAll()方法和示例

java 集合addall集合类的addAll()方法 (Collections Class addAll() method) addAll() Method is available in java.lang package. addAll()方法在java.lang包中可用。 addAll() Method is used to put all the given elements(ele) to the given collection (co). addAll()方…

国家可持续发展议程创新示范区创建工作推进会在北京召开

2019独角兽企业重金招聘Python工程师标准>>> 为推进地方申报国家可持续发展议程创新示范区相关工作&#xff0c;根据国家可持续发展议程创新示范区创建工作的进展及需求&#xff0c;2017年4月23日—25日&#xff0c;科技部社会发展科技司、中国21世纪议程管理中心在…

java控制台打印图片_java——控制台输入打印图形

1. 打印直角三角形需求说明&#xff1a;从控制台输入直角三角形的高度(行数)。每行*的数目依次为1、3、5、7等。实现思路&#xff1a;外层循环控制行数&#xff0c;根据用户输入的行数得到外层循环条件分析每行打印的内容&#xff1a;每一行均打印*号&#xff0c;第i行的*号数为…

Java日历compareTo()方法与示例

日历类的compareTo()方法 (Calendar Class compareTo() method) compareTo() method is available in java.util package. compareTo()方法在java.util包中可用。 compareTo() method is used to compare two Calendar objects or in other words, we can say this method is u…

在struts2中配置自定义拦截器放行多个方法

源码&#xff1a; 自定义的拦截器类&#xff1a; //自定义拦截器类:LoginInterceptor ; package com.java.action.interceptor; import javax.servlet.http.HttpSession; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionInvocation;im…

java多态和泛型_Java面向对象(二) 接口、多态和泛型

一、接口二、多态多态是同一个行为具有多个不同表现形式或形态的能力。2.1 类型转换转换方式隐式 向上转型对于基本数据类型&#xff0c;存储容量低的可自动向存储容量高的类型转换对于引用变量&#xff0c;子类可被转换为超类&#xff0c;可被赋给所属类实现的接口的引用显式 …

Java ArrayList contains()方法及示例

ArrayList类contains()方法 (ArrayList Class contains() method) contains() method is available in java.util package. contains()方法在java.util包中可用。 contains() method is used to check whether this Arraylist contains the given object or not. contains()方法…

BlockingQueue详解

前言&#xff1a; 在新增的Concurrent包中&#xff0c;BlockingQueue很好的解决了多线程中&#xff0c;如何高效安全“传输”数据的问题。通过这些高效并且线程安全的队列类&#xff0c;为我们快速搭建高质量的多线程程序带来极大的便利。本文详细介绍了BlockingQueue家庭中的所…

java isempty_Java ArrayDeque isEmpty()方法与示例

java isemptyArrayDeque类isEmpty()方法 (ArrayDeque Class isEmpty() method) isEmpty() Method is available in java.lang package. isEmpty()方法在java.lang包中可用。 isEmpty() Method is used to check whether this deque is "empty" or "non-empty&qu…