为什么浏览器中有些图片、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


目录
打赏
0
0
0
1
54
分享
相关文章
如何将 Swagger 文档导出为 PDF 文件
你会发现自己可能需要将 Swagger 文档导出为 PDF 或文件,以便于共享和存档。在这篇博文中,我们将指导你完成将 Swagger 文档导出为 PDF 格式的过程。
Apple Safari 18.5 - macOS 专属浏览器 (独立安装包下载)
Apple Safari 18.5 - macOS 专属浏览器 (独立安装包下载)
91 4
Apple Safari 18.5 - macOS 专属浏览器 (独立安装包下载)
使用CodeBuddy实现批量转换PPT、Excel、Word为PDF文件工具
通过 CodeBuddy 实现本地批量转换工具,让复杂的文档处理需求转化为 “需求描述→代码生成→一键运行” 的极简流程,真正实现 “技术为效率服务” 的目标。感兴趣的快来体验下把
89 10
Apple Safari 18.4 - macOS 专属浏览器 (独立安装包下载)
Apple Safari 18.4 - macOS 专属浏览器 (独立安装包下载)
137 3
Apple Safari 18.4 - macOS 专属浏览器 (独立安装包下载)
OCRmyPDF:16.5K Star!快速将 PDF 文件转换为可搜索、可复制的文档的命令行工具
OCRmyPDF 是一款开源命令行工具,专为将扫描的 PDF 文件转换为可搜索、可复制的文档。支持多语言、图像优化和多核处理。
673 17
OCRmyPDF:16.5K Star!快速将 PDF 文件转换为可搜索、可复制的文档的命令行工具
【全自动改PDF名】批量OCR识别提取PDF自定义指定区域内容保存到 Excel 以及根据PDF文件内容的标题来批量重命名
学校和教育机构常需处理成绩单、报名表等PDF文件。通过OCR技术,可自动提取学生信息并录入Excel,便于统计分析和存档管理。本文介绍使用阿里云服务实现批量OCR识别、内容提取、重命名及导出表格的完整步骤,包括开通相关服务、编写代码、部署函数计算和设置自动化触发器等。提供Python示例代码和详细操作指南,帮助用户高效处理PDF文件。 链接: - 百度网盘:[链接](https://pan.baidu.com/s/1mWsg7mDZq2pZ8xdKzdn5Hg?pwd=8866) - 腾讯网盘:[链接](https://share.weiyun.com/a77jklXK)
464 5
【图片型PDF】批量识别扫描件PDF指定区域局部位置内容,将识别内容导出Excel表格或批量改名文件,基于阿里云OCR对图片型PDF识别改名案例实现
在医疗和政务等领域,图片型PDF文件(如病历、报告、公文扫描件)的处理需求广泛。通过OCR技术识别这些文件中的文字信息,提取关键内容并保存为表格,极大提高了信息管理和利用效率。本文介绍一款工具——咕嘎批量OCR系统,帮助用户快速处理图片型PDF文件,支持区域识别、内容提取、导出表格及批量改名等功能。下载工具后,按步骤选择处理模式、进行区域采样、批量处理文件,几分钟内即可高效完成数百个文件的处理。
532 8
PDF预览:利用vue3-pdf-app实现前端PDF在线展示
通过本文的介绍,我们详细了解了如何在Vue3项目中使用vue3-pdf-app实现PDF文件的在线展示。从项目初始化、插件集成到高级功能的实现和部署优化,希望对你有所帮助。在实际项目中,灵活运用这些技术可以大大提升用户体验和项目质量。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
模板字符串和普通字符串在浏览器和 Node.js 中的性能表现是否一致?
综上所述,模板字符串和普通字符串在浏览器和 Node.js 中的性能表现既有相似之处,也有不同之处。在实际应用中,需要根据具体的场景和性能需求来选择使用哪种字符串处理方式,以达到最佳的性能和开发效率。
169 63

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问