为什么浏览器中有些图片、PDF等文件点击后有些是预览,有些是下载

简介: 为什么浏览器中有些图片、PDF等文件点击后有些是预览,有些是下载

目录


为什么浏览器中有些图片、PDF等文件点击后有些是预览,有些是下载,

出现图片、PDF不能预览的情况,主要是通过代码输出文件流的形式,非IIS、Nginx下直接访问资源的方式产生的

在HTTP中,用于文件下载的常见响应头(response headers)包括:

Content-Disposition: 用于指示浏览器应该如何处理响应体。在文件下载中,通常设置为 attachment; filename="filename.jpg",其中 filename.jpg 是要下载的文件名。

Content-Type: 指示响应体的MIME类型,例如 image/jpeg 或 application/pdf。

Content-Length: 响应体的长度(以字节为单位)。

Cache-Control: 控制缓存的行为,通常可以设置为 no-cache 禁止缓存。

Expires: 指定响应的过期时间,与 Cache-Control 一起使用来控制缓存。

Pragma: 旧版本的HTTP使用的头部,现在基本不再使用,可以设置为 no-cache。

Content-Disposition

Content-Disposition 是一个HTTP响应头部,指示浏览器如何处理接收到的响应体内容。它可以让服务器指定一个文件名,或者指示浏览器直接显示内容(inline)或者将内容作为附件下载(attachment)。

  • inline:浏览器尝试在页面内显示响应内容,通常用于非下载内容,如 PDF 在线预览。
  • attachment:浏览器强制下载响应内容,并提示用户保存到本地。
Content-Disposition: inline
Content-Disposition: attachment
Content-Disposition: attachment; filename="example.txt"

文件下载

通常情况下,服务器会使用 Content-Disposition: attachment 头部来强制浏览器下载文件,而不是尝试在浏览器中打开它。例如:

Content-Disposition: attachment; filename="example.pdf"
Content-Type: application/pdf

内联显示

服务器可能希望浏览器直接在页面内显示内容,而不是下载它。例如,对于一些直接展示的文件类型(如图片、PDF等),可以使用

Content-Disposition: attachment; filename="example.pdf"
Content-Type: application/pdf

代码示例

SpringBoot 接口输出文件流:

https://www.cnblogs.com/vipsoft/p/16662762.html

https://www.cnblogs.com/vipsoft/p/16318030.html

//省去判断,参考下面的C#
headers.add("Content-Disposition", "attachment; filename=" + URLEncoder.encode(file.getName(), "UTF-8"));   //如果是 attachment 换成 inline ,像PDF,图片这样的就可以在浏览器内直接预览了
headers.add("filename",  URLEncoder.encode(file.getName(), "UTF-8"));
headers.add("Access-Control-Expose-Headers", "filename");  //这个要加,否则Vue 在 res.headers['filename'] 时取不到值

C# 伪代码

[HttpGet]
[Route("reportFile")]
public HttpResponseMessage ReportFile([FromBody] Order param)
{
  HttpResponseMessage result = null;
  try
  {   
      string projectId = HttpContext.Current.Request.QueryString["ProjectId"];
    FileInfo foundFileInfo = new FileInfo(filePath);  
    if(!foundFileInfo.Exists)
    { 
      return new HttpResponseMessage(HttpStatusCode.NotFound);
    }
    string mediaType = "application/pdf";
    string contentDisposition = "attachment"; 
    //根据服务器文件的扩展名决定使用什么样的方式输出
    switch (foundFileInfo.Extension)
    {
      case ".xml":
        mediaType = "text/xml"; 
        contentDisposition = "inline; //浏览器预览
      break;
      case ".pdf":
        mediaType = "application/pdf";
        contentDisposition = "inline; //浏览器预览
      break;
      case ".jpg":
      case ".jpeg":
        mediaType = "image/jpg";
        contentDisposition = "inline; //浏览器预览
      break;
      case ".png":
        mediaType = "image/png";
        contentDisposition = "inline; //浏览器下载
      break;
      ...
      default:
        mediaType = "application/octet-stream"; 
        contentDisposition = "attachment"; //浏览器下载
      break;
    } 
    FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
    result = new HttpResponseMessage(HttpStatusCode.OK);
    result.Content = new StreamContent(fs);
    //result.Content.Headers.Add("MD5File", Md5Helper.GetMD5HashFromFile(filePath)); //可以在Header里加上 md5 校验码
    result.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue(mediaType);
    result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue(contentDisposition);
    result.Content.Headers.ContentDisposition.FileName = foundFileInfo.Name;
  }
  catch (Exception ex)
  {
    logger.Error(ex, ex.Message);
    result = new HttpResponseMessage(HttpStatusCode.BadRequest);
  }
  return result;
}

常见的媒体类型

  • text/plain:纯文本。
  • text/html:HTML 文档。
  • application/json:JSON 数据。
  • application/xml:XML 数据。
  • image/jpeg、image/png:JPEG 或 PNG 图像。
  • multipart/form-data:用于文件上传的表单数据。

文件上传

在使用表单上传文件时,通常会使用 multipart/form-data 媒体类型,并指定边界字符串。例如:

Content-Type: multipart/form-data; boundary=---------------------------7d33a816d302b6


目录
相关文章
|
1月前
|
人工智能 文字识别 数据挖掘
MarkItDown:微软开源的多格式转Markdown工具,支持将PDF、Word、图像和音频等文件转换为Markdown格式
MarkItDown 是微软开源的多功能文档转换工具,支持将 PDF、PPT、Word、Excel、图像、音频等多种格式的文件转换为 Markdown 格式,具备 OCR 文字识别、语音转文字和元数据提取等功能。
214 9
MarkItDown:微软开源的多格式转Markdown工具,支持将PDF、Word、图像和音频等文件转换为Markdown格式
|
1月前
|
JavaScript
jquery图片和pdf文件预览插件
EZView.js是一款jquery图片和pdf文件预览插件。EZView.js可以为图片和pdf格式文件生成在线预览效果。支持的文件格式有pdf、jpg、 png、jpeg、gif。
54 16
|
1月前
|
编解码 人工智能 文字识别
用PDF转换图片的方式弥补通义千问在扫描版PDF支持方面的缺失
当前通义千问Web版和本地版qwen-VL在处理扫描版PDF时均无法直接识别,导致实际应用中处理大量扫描PDF的需求难以满足。为此,通过使用Python的pdf2image库,可将PDF文件转换为图片,再进行OCR处理,实现解决方案。文中提供了具体的代码示例,展示了如何将PDF文件的每一页转换成图片,并保存至指定文件夹,为后续的OCR处理做好准备。
|
2月前
|
Web App开发 缓存 安全
WIN11 Chrome 双击打不开闪退及Chrome浏览器不能拖拽文件crx
【11月更文挑战第6天】本文介绍了 WIN11 系统中 Chrome 浏览器双击打不开闪退及不能拖拽文件 crx 的原因和解决方法。包括浏览器版本过旧、扩展程序冲突、硬件加速问题、缓存过多、安全软件冲突、系统文件损坏、用户配置文件损坏等问题的解决方案,以及 crx 文件的屏蔽、权限问题和文件格式问题的处理方法。
246 2
|
3月前
|
Web App开发 Java
使用java操作浏览器的工具selenium-java和webdriver下载地址
【10月更文挑战第12天】Selenium-java依赖包用于自动化Web测试,版本为3.141.59。ChromeDriver和EdgeDriver分别用于控制Chrome和Edge浏览器,需确保版本与浏览器匹配。示例代码展示了如何使用Selenium-java模拟登录CSDN,包括设置驱动路径、添加Cookies和获取页面源码。
232 6
|
3月前
|
Java Apache Maven
将word文档转换成pdf文件方法
在Java中,将Word文档转换为PDF文件可采用多种方法:1) 使用Apache POI和iText库,适合处理基本转换需求;2) Aspose.Words for Java,提供更高级的功能和性能;3) 利用LibreOffice命令行工具,适用于需要开源解决方案的场景。每种方法都有其适用范围,可根据具体需求选择。
|
3月前
|
Java Apache Maven
Java将word文档转换成pdf文件的方法?
【10月更文挑战第13天】Java将word文档转换成pdf文件的方法?
993 1
|
3月前
|
索引 Python
PDF文件页面提取操作小指南
PDF文件页面提取操作小指南
121 4
|
3月前
|
Python
Python对PDF文件页面的旋转和切割
Python对PDF文件页面的旋转和切割
61 3
|
3月前
|
计算机视觉 Python
Python操作PDF文件
Python操作PDF文件
53 1

热门文章

最新文章