当前位置: 首页 > 编程笔记 >

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

杨曜瑞
2023-03-14
本文向大家介绍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读取文件流,设置浏览器下载或直接预览操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持小牛知识库。

 类似资料:
  • 本文向大家介绍C#导出pdf的实现方法(浏览器不预览直接下载),包括了C#导出pdf的实现方法(浏览器不预览直接下载)的使用技巧和注意事项,需要的朋友参考一下 前言 这篇文章主要给大家介绍了关于C#导出pdf的实现方法,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 方法如下: 一.接口部分的代码 二.返回pdfbyte数组 1.下载http模式的pdf文件(以ASP.NET为例,

  • 预览 在编辑器工具栏上选择 浏览器 后,点击旁边的按钮,会在用户的默认桌面浏览器中直接运行游戏的网页版本。推荐使用谷歌浏览器(Chrome)作为开发过程中预览调试用的浏览器,因为谷歌浏览器(Chrome)的开发者工具是最为全面强大的。 浏览器预览界面的最上边有一系列控制按钮可以对预览效果进行控制: 最左边选择预览窗口的比例大小,来模拟在不同移动设备上的显示效果 Rotate 按钮决定显示横屏还是竖

  • 问题内容: 一切正常,但是只有当文件很小(大约1MB)时,当我尝试使用更大的文件(例如20MB)时,我的浏览器将其显示,而不是强制下载,到目前为止,我尝试了许多标头,现在我的代码看起来像: 问题答案: 在将文件内容写入输出流之后,你将设置响应头。在响应生命周期中设置标头很晚。正确的操作顺序应该是首先设置头,然后将文件的内容写入servlet的输出流。 因此,你的方法应编写如下(由于仅是表示形式,因

  • 本文向大家介绍Asp.net实现直接在浏览器预览Word、Excel、PDF、Txt文件(附源码),包括了Asp.net实现直接在浏览器预览Word、Excel、PDF、Txt文件(附源码)的使用技巧和注意事项,需要的朋友参考一下 1.功能说明 输入文件路径,在浏览器输出文件预览信息,经测试360极速(Chrome)、IE9/10、Firefox通过 2.分类文件及代码说明 DemoFiles 存

  • 我有两个问题:我的生锈语言和我的英语语言;) 我用“use std::net::TcpListener;use std::net::TcpStream;”修改了一个迷你服务器从铁锈书的例子(https://doc.rust-lang.org/book/ch20-03-graceful-shutdown-and-cleanup.html)这段代码在Firefox浏览器常见的“表单”中运行得非常完美,

  • 问题内容: 我有一个页面,允许用户下载动态生成的文件。生成需要很长时间,因此我想显示一个“等待”指示器。问题是,我不知道如何检测浏览器何时收到文件,因此可以隐藏指示器。 我正在以隐藏的形式发出请求,该请求会发布到服务器,并以隐藏的iframe作为结果。这样一来,我就不会用结果替换整个浏览器窗口。我在iframe上侦听“加载”事件,希望下载完成后将触发该事件。 我随文件返回一个“ Content-D