pdf格式文件下载不预览,云存储的跨域解决

2023-10-26

需求背景

后端接口中返回的是pdf文件路径比如:

pdf文件路径 (https://wangzhendongsky.oss-cn-beijing.aliyuncs.com/wzd-test.pdf)

前端适配是这样的

 <a
        href="https://wangzhendongsky.oss-cn-beijing.aliyuncs.com/wzd-test.pdf"
      >
        超链接预览pdf
      </a>

点击后预览

但是客户方要求不预览点击后直接下载

示例演示  (pdf下载 - 码上掘金

项目准备

有pdf链接的可以跨过该阶段

准备一个线上的pdf文件链接

登陆阿里云平台

1. 点击又上角的控制台

 2. 点击左上角的三道杠图标

 3. 点击左侧的对象云存储oss

 4. 点击bucket

5. 创建 bucket

 6. 创建成功后

 7. 上传文件

点击红框处

 点击上传文件

 

8. 上传完成后为了方便访问可以把文件的访问属性修改为公共的

到这里文件链接就创建好了,可以直接复制链接访问

解决文件链接跨域问题

点击数据安全中的跨域设置

规则设置

 

设置完成后就可以随意访问了啦

实现(js)

HML

<!DOCTYPE html>
<html lang="CH-EN">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>下载</title>
  </head>
  <body>
    <div class="content">
      <a
        href="https://wangzhendongsky.oss-cn-beijing.aliyuncs.com/wzd-test.pdf"
      >
        超链接预览pdf
      </a>

      <button id="btn" type="submit" onclick="download()">点击下载pdf</button>
    </div>
  </body>
</html>

script

<script>
  const filePath =
    "https://wangzhendongsky.oss-cn-beijing.aliyuncs.com/wzd-test.pdf";
  //  fileName是pdf名称 、filePath是pdf地址
  function downloadFil(fileName, filePath) {
    var ajax = new XMLHttpRequest();
    ajax.open("GET", filePath, true);
    ajax.responseType = "blob";
    ajax.onload = (e) => {
      console.log(e);
      let res = e.target.response;
      let blob = new Blob([res]);
      let aLink = document.createElement("a");
      aLink.download = `${fileName}.pdf`; // 下载文件的名字
      aLink.href = URL.createObjectURL(blob);
      aLink.click();
    };
    ajax.send();
  }
  function download() {
    downloadFil("test", filePath);
  }
</script>

style

<style>
  * {
    margin: 0;
    padding: 0;
  }
  body {
    display: flex;
    align-items: center;
    justify-content: center;
  }
  .content {
    height: 300px;
    width: 500px;
    border: solid #ddd 1px;
    text-align: center;
    padding: 20px;
  }
  .content input {
    height: 24px;
    line-height: 24px;
    font-size: 18px;
    border: 1px solid #dcdfe6;
  }
  .content input:focus {
    outline: none;
    border-color: #409eff;
  }
  .content input:focus-visible {
    outline-offset: 0px;
  }
</style>

实现(vue)

downloadjs

github地址:https://github.com/rndme/download

安装


npm install downloadjs -S

导入

import download from "downloadjs"


使用

download(url, strFileName, strMimeType);
download第一个参数为URL,第二个参数为文件名称,第三个参数文件类型,url必填,另外两个选填

遇到的问题

1.下载的文件打不开,且大小不对 // 中文名称文件下载 download(encodeURI(URL))
2.不能自定义名称
在URL进行转码后虽然可以下载PDF文件了,但名称却是转码后的名称,而不是原本的名称,这时我们用第二个参数进行命名时,名称是对了,可文件却出现打不开,大小不对的情况,暂时没找到解决方法。

file-saver

github地址:https://github.com/eligrey/FileSaver.js

该库是我之前写页面转PDF时使用到的库,既然之前可以保存pdf文件,那现在是不是也可以呢,上网一搜还真可以

安装

npm i file-saver

使用 

const that = this
var oReq = new XMLHttpRequest()
var URL= '' // URL 为URL地址
oReq.open('GET', URL, true)
oReq.responseType = 'blob'
oReq.onload = function() {
  var file = new Blob([oReq.response], {
    type: 'blob'
  })
  FileSaver.saveAs(file, that.name) // that.name为文件名
}
oReq.send()

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pdf格式文件下载不预览,云存储的跨域解决 的相关文章

  • 如何在 Chrome 中创建 TouchEvent?

    The W3C规范 http www w3 org TR 2011 WD touch events 20110505 idl def TouchEvent宣称initTouchEvent如下 void initTouchEvent in D
  • 如何使用键盘和鼠标控制相机 - Three.js

    我在 WEB GL 中有一个带有 Three js 的 3D 环境 并且我曾经使用 Orbitcontrols js http codepen io nireno pen cAoGI http codepen io nireno pen c
  • 如何使用 Ghostscript DLL 将 PDF 转换为 PDF/A

    如何使用 GhostScript DLL 将 PDF 转换为 PDF A 我知道我必须调用 gsdll32 dll 的导出函数 其名称为 gsapi init with args 但如何传递正确的参数 顺便说一句 我正在使用 C 请尝试从命
  • 如何通过 HTML 按钮播放声音

    我目前通过网站播放音乐的方法是通过 HTML 音频标签 不过我希望能够通过 HTML 按钮来播放它 该按钮应该能够在播放和停止之间切换音乐 我在 JSFiddle 创建了一个示例 但不知道如何实现它 有人可以告诉我如何使用我的 JSFidd
  • 在浏览器中语音聊天? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我们正在寻求建立一个小组 voice 使用服务器上的node js 在浏览器中聊天 这可能吗 如果您希望您的解决方案是基于服务器端和客
  • 将音频与视频流合并 Node.js

    我正在创建 YouTube 视频下载器并且正在使用ytdl core库 它无法下载带有音频的高质量视频 因为 youtube 将其放在另一个文件中 但我需要将其全部下载到一个文件中 我已经这样做了 app get download asyn
  • 何时不使用承诺[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在阅读了数十篇关于 es6 Promise 有多伟大以及为什么我们应该实现它们的文章之后 我有这样的感觉 ALL我的 不平凡的 JavaScri
  • 如何记录返回的事件发射器

    如何记录所发出的事件stream返回于MyFunc 与 JSDoc MyFunc description param Object opts description return Stream description function My
  • JavaScript 动画平滑滚动

    默认情况下 当您有这样的片段链接时 a href some url some fragment some text a 浏览器立即向下滚动到该片段 我该如何编程才能使用标准 JS 顺利地向下移动到该片段 这是一个例子 Example htt
  • iframe 重新加载按钮

    我浏览了很多网站 但似乎没有一个能正常工作 或者我不明白它们 我想要一个刷新某个 iframe 的简单按钮 该按钮将位于父页面上 并且 iframe 名称为 Right 有很多方法可以做到这一点 假设这个iframe markup 我们可以
  • 如何从顺序键盘导航中删除 Vuetify 附加图标

    在带有 Vuetify 的 Vue js 应用程序中 我有一组用v text field并且其中有一个append icon为了切换文本可见性 如下所示
  • 如何在启用嵌入时间戳和 LTV 的情况下签署 PDF?

    我正在尝试签署启用了时间戳和 LTV 的 pdf 以便它在 Adob e Reader 中显示如下 在英语中 这意味着 签名包含嵌入的时间戳 和 签名启用了 LTV 这是我正在使用的代码 PrivateKey pk get pk from
  • React无限滚动scrollableTarget动态获取id?

    我在我的项目中使用react infinite scroll component 如何让scrollableTarget动态获取item id 我试过这样scrollableTarget item id 但它不起作用 必须与该 div 具有
  • window.showModalDialog 的等效跨浏览器解决方案是什么?

    window showModalDialog 的等效跨浏览器解决方案有哪些 showModalDialog 在 IE 和 FF 3 中引入 我个人认为没有 但是有很多 UI 工具包提供了这样的功能 例如jQuery UI http jque
  • 从多维无穷大数组中删除数组元素

    我想删除一个特定元素 例如 我想删除元素id 76在下面的数组中 而且 数组可以无限地组合在一起 这里的问题是我无法刷新页面 因为我使用 Vue js 进行即时操作 如果我能做到这一点 我的下一个问题可能是如何在我现在想要的地方添加一个元素
  • 需要js、d3 和 nvd3 集成

    我面临整合的问题要求 questions tagged requirejs with d3 questions tagged d3 and nvd3 questions tagged nvd3 我找到了一个使用 require 的简单解决方
  • 您如何看待引导模式触发器的相应回调?

    On 引导模态 http getbootstrap com javascript modals 我们知道我们可以为触发器绑定事件 例如show or hide using show shown hide hidden 但此事件绑定仅适用于一
  • React Native - 跨屏幕传递数据

    我遇到了一些麻烦react native应用程序 我不知道如何跨屏幕传递数据 我意识到还有其他类似的问题在 SO 上得到了回答 但是这些解决方案对我来说不起作用 我正在使用StackNavigator 这是我的设置App js file e
  • 当选择下拉列表中的某些值时,取消选中复选框

    当我从下拉列表中选择某个值或用户未从下拉列表中选择任何值时 我需要取消选中复选框 我现在正在使用 Jquery 这是我现在使用的代码 但它不起作用 Script
  • Django 与谷歌图表

    我试图让谷歌图表显示在我的页面上 但我不知道如何将值从 django 视图传递到 javascript 以便我可以绘制图表 姜戈代码 array Year Sales Expenses 2004 1000 400 2005 1170 460

随机推荐

  • 软件测试之项目立项与需求评审

    实际中项目立项相关事宜 介绍项目情况 目前立项阶段情况 项目市场预估 项目时间讨论 资源情况 需要人力 物力 技术 工具 一般使用的开发语言 工具 测试工具 在系统运行中需要的工具 部门情况 参与的部门 主要负责人 部门只要职责 后期主要工
  • windows下CUDA的卸载,怒推!!!亲测可以!!!

    我在配置VS和CUDA的过程中 出现了差错 因此不得不卸载CUDA 下面是卸载CUDA的教程 亲测有效 教程 1 windows自带的控制面板 用来卸载主程序windows自带的控制面板 用来卸载主程序 在控制面版中打开程序和功能 卸载CU
  • mysql取24小时数据

    MySQL是一种常用的关系型数据库管理系统 在进行实时数据处理时 我们常常需要查询最近24小时的数据来进行分析和处理 下面我们将介绍如何使用MySQL查询最近24小时的数据 SELECT FROM table name WHERE time
  • 【小教程】快捷键启动&关闭Windows Terminal

    快捷键启动 方法一 Win S 搜索Windows Terminal 固定到 开始 屏幕 开始屏幕拖动图标 同时按下 Win D 切换到桌面 生成快捷方式链接 右键快捷方式 gt 属性 gt 快捷键设定 推荐 Ctrl Alt T 和Ubu
  • 第二章数学基础---2.1虚拟地球坐标系

    2 1虚拟地球坐标系 分为地理坐标系 经纬高 和笛卡尔坐标系 x y z 一般跨度度数 经度 180 180 纬度 90 90 经纬度也可以按照弧度度量 转换方式如下 分为三维Geodetic3D 经纬高 Geodetic2D 经纬度 表示
  • win11环境配置pip安装源 及更新pip版本

    一 pip命令 Fatal error in launcher Unable to create process using 解决问题日志 搜索历程 在网上搜索 Fatal error in launcher Unable to creat
  • C# 修改保存 配置文件的两种方式以及区别

    第一种为 Properties Settings Default 参数名 参数值 Properties Settings Default Save 在第一次运行时会读取App config里的初始值 但是一旦调用Save方法后 Settin
  • 2021-03-22

    问题描述 中国有句俗语叫 三天打鱼两天晒网 某人从2010年1月1日起开始 三天打鱼两天晒网 问这个人在以后的某一天中是 打鱼 还是 晒网 用C或C 语言实现程序解决问题 基本要求 1 程序风格良好 使用自定义注释模板 提供友好的输入输出
  • 巧用10行python 代码让JMETER实现动态验证码登录

    一 第三方工具准备 1 准备python 环境 2 使用 使用第三方库Python免费验证码识别之ddddocr识别OCR自动库实现 3 安装方法 镜像 pip install ddddocr i https pypi tuna tsing
  • python为啥叫蛇_python为什么被称为蟒蛇?

    首先 我们从Python的前世今生说起 Python是著名的吉多 范罗苏姆 龟叔 Guido van Rossum在1989年圣诞节期间 为了打发无聊的圣诞节而编写的一个编程语言 太无聊了 无聊到想敲代码了 无聊起来敲代码 这可不是随便人都
  • html css 和 js 如何协同工作的

    html css 和 js 如何协同工作的 一个简单的登录样式的demo 在html中通过 标签引入对应的css文件 例如
  • 2021-07-12 IDEA命令行整合git bash,Maven打包出现oom的问题以及解决方案

    项目场景 个人IDEA的一个习惯就是使用git bash的命令行 主要是第一个觉得好看 第二个是linux 命令ls 和ll不香吗 我要去用dir 问题描述 配置好git bash后 使用mvn打包一个超大项目 我之前配置过mvn cmd的
  • CentOS7下docker部署vsftpd服务

    CentOS7下docker部署vsftpd服务 1 安装docker 略 2 创建目录 mkdir p data ftp files mkdir p data ftp conf 3 启动vsftpd服务 注意 主动模式和被动模式的区别在于
  • Swagger在线文档

    Swagger 什么 Swagger 定义 Swagger 是是一款让你更好的书写API文档的框架 用于生成 描述 调用和可视化 RESTful 风格的 Web 服务 总体目标是使客户端和文件系统作为服务器以同样的速度来更新文件的方法 参数
  • 如何才能成为优秀的架构师?

    我们知识星球开通快一周了 已有很有小伙伴加入 我们开通知识星球的目的 就是助力大家提高技术 阻力个人成长 今天是优惠最后一天 明天星球将提价为99元 欢迎大家加入 具体见文末 什么是知识星球 星球是一个分享知识和经验的平台 有许多技术大佬纷
  • OpenCV 陷波滤波器消除周期性噪音 C++

    观察下面图像 有明显的近似水平线的噪音模式 我们希望他在频率域内的成分沿垂直轴集中 下图是该图像的谱 将垂直轴的分量去掉 构建的陷波器如下 原图与结果图对比 滤掉的空间噪音模式 代码实现 include opencv2 opencv hpp
  • KATEX简易语法:

    呼唤 Mardown中使用KATEX的语法 请使用 包围 Notion中用 math 来呼唤使用 数学符号 123 123 123 123 x
  • 在cmd中输入URL地址,提示“找不到应用程序”解决方案

    有好几次都遇到了这种情况 在cmd中输入一个URL地址 再按Enter键 就提示 http 找不到应用程序 我开始还以为什么文件损坏了呢 吓得我一跳 后来我总算发现问题的原因了 其实是由于我之前装了一个浏览器 并将其设置为默认的 后来这个浏
  • Delphi_SysUtils中文翻译

    系统实用例程 Delphi Kylix 跨平台运行时库 System Utilities Copyright c 1995 2002 Borland Softwrare Corporation SysUtils单元 1 常量 Const 1
  • pdf格式文件下载不预览,云存储的跨域解决

    需求背景 后端接口中返回的是pdf文件路径比如 pdf文件路径 https wangzhendongsky oss cn beijing aliyuncs com wzd test pdf 前端适配是这样的 a href https wan