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读取文件流,设置浏览器下载或直接预览操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Java后台Controller实现文件下载操作

    代码 参数: 1.filePath:文件的绝对路径(d:\download\a.xlsx) 2.fileName(a.xlsx) 3.编码格式(GBK) 4.response.request不介绍了,从控制器传入的http对象 代码片. //控制器 @RequestMapping(UrlConstants.BLACKLIST_TESTDOWNLOAD) public void downLoad(String filePath, HttpServletResponse response, Http

  • java实现文件下载的两种方式

    本文实例为大家分享了java实现文件下载的具体代码,供大家参考,具体内容如下 public HttpServletResponse download(String path, HttpServletResponse response) { try { // path是指欲下载的文件的路径. File file = new File(path); // 取得文件名. String filename = file.getName(); // 取得文件的后缀名. String ext = filena

  • Java实现文件读取和写入过程解析

    需求说明 实际操作过程中,从D盘根目录下的ak.txt读取文件写入D盘根目录下的hello.txt文件内 实现思路 写两个方法,一个用于读取目标文件,一个用于写入目标文件--详情见代码注释 代码内容 文件读取和写入练习 package com.io; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOExce

  • JAVA读取文件流,设置浏览器下载或直接预览操作

    最近项目需要在浏览器中通过URL预览图片.但发现浏览器始终默认下载,而不是预览.研究了一下,发现了问题: // 设置response的Header,注意这句,如果开启,默认浏览器会进行下载操作,如果注释掉,浏览器会默认预览. response.addHeader("Content-Disposition", "attachment;filename=" + FileUtil.getOriginalFilename(path)); 然后需要注意: response.s

  • java实现文件上传、下载、图片预览

    这篇文章主要介绍了java实现文件上传.下载.图片预览,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 多文件保存到本地: @ResponseBody @RequestMapping(value = "/uploadApp",produces = { "application/json;charset=UTF-8" },method= RequestMethod.POST) public String uploadA

  • java使用文件流实现查看下载次数

    本文实例为大家分享了java使用文件流实现查看下载次数的具体代码,供大家参考,具体内容如下 需求:点击一个按钮的次数或者是展示文件,游戏被下载的次数 实现:开辟一个流文件,用来保存被下载的次数,然后读文件中value,点击一次value加1,再将此value保存到流文件中. 三种方法: package cn.tr.test; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; imp

  • React获取Java后台文件流并下载Excel文件流程解析

    记录使用blob对象接收java后台文件流并下载为xlsx格式的详细过程,关键部分代码如下. 首先在java后台中设置response中的参数: public void exportExcel(HttpServletResponse response, String fileName, String sheetName, List<String> titleRow, List<List<String>> dataRows) { OutputStream out = nu

  • Java实现文件上传和下载的方法详解

    目录 1.文件上传 1.1 介绍 1.2 代码实现 2.下载 2.1 介绍 2.2 代码实现 1.文件上传 1.1 介绍 文件上传,也称为upload,是指将本地图片.视频.音频等文件上传到服务器上,可以供其他用户浏览或下载的过程.文件上传在项目中应用非常广泛,我们经常发微博.发微信朋友圈都用到了文件上传功能. 文件上传时,对页面的form表单有如下要求: 表单属性 取值 说明 method post 必须选择post方式提交 enctype multipart/form-data 采用mult

  • Java 批量文件压缩导出并下载到本地示例代码

    主要用的是org.apache.tools.zip.ZipOutputStream  这个zip流,这里以Execl为例子. 思路首先把zip流写入到http响应输出流中,再把excel的流写入zip流中(这里可以不用生成文件再打包,只需把execl模板读出写好数据输出到zip流中,并为每次的流设置文件名) 例如:在项目webapp下execl文件中 存在1.xls,2.xls,3.xls文件 1.Controller @RequestMapping(value = "/exportAll&qu

  • java实现文件上传和下载

    本文实例为大家分享了java实现文件上传和下载的具体代码,供大家参考,具体内容如下 文件的上传 upload:文件上传 客户端通过表单的文件域file  把客户端的文件 上传保存到服务器的硬盘上 页面 首先对上传的表单有以下要求: 必须有文件域:input type=file 表单提交方式:method=post 表单的 enctype=multipart/form-data <form method="post" action="/user/regist"

  • vue-以文件流-blob-的形式-下载-导出文件操作

    vue项目中,经常遇到文件导出与下载,有时候是直接返回服务端的文件url,这样直接以a链接下载,或者windown.open对不同类型的文件进行下载或预览.但如果返回的是文件流,则需要做一些其他处理,具体形式如下: 1.首先要确定服务器返回的数据类型. 在请求头中加入: config.responseType = 'blob' 有时候,不是所有接口都需要该类型,则可以对接口做一个判定: // request拦截器 service.interceptors.request.use( config

  • java读取文件里面部分汉字内容乱码的解决方案

    java读取文件里面部分汉字内容乱码 读取一个txt文件,到代码中打印出来,发票有部分汉字的内容是乱码的. 我开始的方式是这样的, 如下,这是完全错误的,汉字是两个字节的,如果每次读固定个字节,可能会把汉字截断. 就会出现部分乱码的情况. package susq.path;​ import java.io.File; import java.io.FileInputStream; import java.io.IOException; ​ /** * @author susq * @since

  • java读取文件内容,解析Json格式数据方式

    目录 java读取文件内容,解析Json格式数据 一.读取txt文件内容(Json格式数据) 二.解析处理Json格式数据 三.结果存入数据库 四.测试 java 读取txt文件中的json数据,进行导出 以下代码可直接运行 java读取文件内容,解析Json格式数据 一.读取txt文件内容(Json格式数据) public static String reader(String filePath) { try { File file = new File(filePath); if (file

随机推荐