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();
}
}
瀏覽器直接打開效果
下載效果
以上這篇java讀取文件流,設置瀏覽器下載或直接預覽操作就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持萬仟網。
希望與廣大網友互動??
點此進行留言吧!
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的java 看书浏览器官_JAVA读取文件流,设置浏览器下载或直接预览操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: docker仓库搭建、加密、用户认证
- 下一篇: linux udp 端口 抓包,tcpd