php 实现跨站下载图片,一个图片url访问后直接下载怎样实现

一个图片url访问后直接下载怎样实现

先看代码

downloadIamge(imgsrc, name) {//下载图片地址和图片名

let image = new Image();

// 解决跨域 Canvas 污染问题

image.setAttribute("crossOrigin", "anonymous");

image.onload = function() {

let canvas = document.createElement("canvas");

canvas.width = image.width;

canvas.height = image.height;

let context = canvas.getContext("2d");

context.drawImage(image, 0, 0, image.width, image.height);

let url = canvas.toDataURL("image/png"); //得到图片的base64编码数据

let a = document.createElement("a"); // 生成一个a元素

let event = new MouseEvent("click"); // 创建一个单击事件

a.download = name || "photo"; // 设置图片名称

a.href = url; // 将生成的URL设置为a.href属性

a.dispatchEvent(event); // 触发a的单击事件

};

image.src = imgsrc;

},

JavaScript 下载文件

fetch('http://somehost/somefile.zip').then(res => res.blob().then(blob => {

var a = document.createElement('a');

var url = window.URL.createObjectURL(blob);

var filename = 'myfile.zip';

a.href = url;

a.download = filename;

a.click();

window.URL.revokeObjectURL(url);

}))

你可能会问,何必这么麻烦呢?直接写成下面这样不就好了:

嗯,对于这种写法,我只能说,你做的太正确了!如果你要下载的是已经存在服务器上面的静态文件的话,那么写成这样是最方便的。浏览器会帮你处理整个下载过程,不需要你干涉。如果你用 blob 的方式来下载文件的话,会有下面这些限制的:

限制一:不同浏览器对 blob 对象有不同的限制

Browser

Constructs as

Filenames

Max Blob Size

Dependencies

Firefox 20+

Blob

Yes

800 MiB

None

Firefox < 20

data: URI

No

n/a

Chrome

Blob

Yes

500 MiB

None

Chrome for Android

Blob

Yes

500 MiB

None

Edge

Blob

Yes

?

None

IE 10+

Blob

Yes

600 MiB

None

Opera 15+

Blob

Yes

500 MiB

None

Opera < 15

data: URI

No

n/a

Safari 6.1+*

Blob

No

?

None

Safari < 6

data: URI

No

n/a

限制二:构建完 blob 对象后才会转换成文件

这一点限制对小文件(几十kb)可能没什么影响,但对稍微大一点的文件影响就很大了。试想,用户要下载一个 100mb 的文件,如果他点击了下载按钮之后没看到下载提示的话,他肯定会继续按,等他按了几次之后还没看到下载提示时,他就会抱怨我们的网站,然后离开了。

然而事实上下载的的确确发生了,只是要等到下载完文件之后才能构建 blob 对象,再转化成文件。而且,用户再触发多几次下载就会造成一些资源上的浪费。

因此,如果是要下载大文件的话,还是推荐直接创建一个 标签拉~

写 html 也好,写 JavaScript 动态创建也好,用自己喜欢的方式去创建就好了。

## 为什么要用 JavaScript 下载文件

好拉,说了半天,其实我们一直说的都是:「不要用 JavaScript 下载文件拉,限制多多,又不好用,直接用 html 就好拉,简单方便又快捷」这个论调。

事实上也确实如此,但有些时候我们确实需要通过 JavaScript 来做一些预处理。

权限校验

有些时候,我们需要对下载做一些限制,最常见的就是权限校验了,如检查该用户是否有下载的权限,是否有高速下载的权限等等。这时候,我们可以利用 JavaScript 做一些预处理。如:

fetch('http://somehost/check-permission', options).then(res => {

if (res.code === 0) {

var a = document.createElement('a');

var url = res.data.url;

var filename = 'myfile.zip';

a.href = url;

a.download = filename;

a.click();

} else {

alert('You have no permission to download the file!');

}

});

在这个例子里面,我们没有用 blob 来构建 URL,而是通过后端服务器来计算出用户的下载链接,然后再利用之前提到的动态创建 标签的方式来实现下载,很简单吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/574918.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【BZOJ】【1086】 【SCOI2005】王室联邦

树分块 orz vfk && PoPoQQQ http://vfleaking.blog.163.com/blog/static/174807634201231684436977/http://blog.csdn.net/popoqqq/article/details/42772237 这题是要把树分成一块一块的……&#xff08;感觉好像不是原来理解的树分块处理操作啊……&#xff09; 每块…

matlab火焰测温源程序,一种火焰测温方法与流程

本发明涉及一种测量火焰温度的方法。背景技术&#xff1a;火焰是气态的且正在发生剧烈氧化反应的燃料及各种中间产物及最终产物的混合物。在煤化工、化工领域&#xff0c;在高温、高压反应器(或气化炉)上&#xff0c;火焰检测器一般安装在气化炉的顶部或者中下部&#xff0c;用…

python spark hadoop_使用Scala或Python列出存储在Hadoop HDFS上的Spark群集中可用的所有文件?...

列出Spark中本地可用的所有文件名的最有效方法是什么&#xff1f;我正在使用Scala API&#xff0c;但是&#xff0c;Python也应该没问题。解决方案import org.apache.hadoop.fs。{FileSystem&#xff0c;FileUtil&#xff0c;Path}import scala.collection.mutable.Stack$ b $ …

asp.net权限控制配置web.config

项目下 有三个文件夹 A,B,C 验正方式是 Forms 验正 我要设置他们的访问权限为, A,匿名可访问 B,普通用户授权后才能访问 C,只允许管理员访问 <configuration> <location path "A "> <system.web> <authorization> <allow users…

oracle排序函数性能,oracle排序函数

rank,dense_rank,row_number&#xff0c;以及分组排名partitionrank:排名会出现并列第n名&#xff0c;它之后的会跳过空出的名次&#xff0c;例如&#xff1a;1,2,2,4dense_rank:排名会出现并列第n名&#xff0c;它之后的名次为n1&#xff0c;例如&#xff1a;1,2,2,3row_numbe…

pythonplotline_带误差条的python绘图线,pythonplotlinewitherrorbar

我们有时候会面临画带有误差的图&#xff0c;大致长成下面这个样子image.png代码为# -*- coding: utf-8 -*-"""Created on Sun Jul 5 21:12:17 2020author: x1c"""import matplotlib.pyplot as pltimport seaborn as snsimport numpy as npsns.s…

php什么是变量6,PHP变量是什么

PHP是一门弱类型语言&#xff0c;本身不严格区分变量的类型。PHP在变量申明的时候不需要指定类型。PHP在程序运行期间可能进行变量类型的隐示转换。 和其他强类型语言一样&#xff0c;程序中也可以进行显示的类型转换。PHP变量可以分为简单类型(int、string、bool)、集合类型(a…

美国只有两样东西要比中国 贵,一个是智慧财产权,一个是人工

美国只有两样东西比中国贵 最近中国一直在热传美国的物价低于中国&#xff0c;特别是生活必需品方面&#xff0c;甚至换算成同一种货币都低于中国。从整体情况来 看&#xff0c;美国人各项消费的支出所占收入的比例要远远低于中国人。有人提出来疑问说&#xff0c;那美国人收入…

红黑树和平衡二叉树的区别_面试题精选红黑树(c/c++版本)

红黑树的使用场景非常广泛&#xff0c;比如nginx中用来管理timer、epoll中用红黑树管理事件块&#xff08;文件描述符&#xff09;、Linux进程调度Completely Fair Scheduler用红黑树管理进程控制块、CSTL中map,set的底层实现全是用的红黑树。掌握红黑树的原理以及使用场景&…

linux 更新软件命令 失败,对linux下软件(库)的更新命令详解

在ubuntu服务器下安装包的时候&#xff0c;经常会用到sudo apt-get install 包名 或 sudo pip install 包名&#xff0c;那么两者有什么区别呢&#xff1f;1.区别pip用来安装来自PyPI(https://www.python.org/)的python所有的依赖包&#xff0c;并且可以选择安装任何在PyPI上已…

查看oracle死锁进程并结束死锁

查看oracle死锁进程并结束死锁 摘自: http://sqcjy111.iteye.com/blog/1183928 查看锁表进程SQL语句1&#xff1a; select sess.sid, sess.serial#, lo.oracle_username, lo.os_user_name, ao.object_name, lo.locked_mode from v$locked_object lo, dba_objects ao, v$sessio…

python科学坐标图绘制的四个要素_Python3.0科学计算学习之绘图(四)

绘制三维图&#xff1a;mplot3d工具包提供了点、线、等值线、曲面和所有其他基本组件以及三维旋转缩放的三维绘图。1.散点的三维数据图from mpl_toolkits.mplot3d import axes3d #需要从mplot3d模块中导入axes 3D类型import numpy as npimport matplotlib.p…

linux shell tr命令,linux shell tr命令详解

tr命令是linux下的一个命令&#xff0c;那么它的语法和用途是什么呢?下面由学习啦小编为大家整理了linux shell tr命令的相关知识&#xff0c;希望大家喜欢!linux shell tr命令tr是translate的简写&#xff0c;亦即翻译&#xff0c;但是遗憾的是&#xff0c;它不能翻译句子&am…

PHP 函数:intval()

intval 变量转成整数类型。 语法: int intval(mixed var, int [base]); 返回值: 整数 函数种类: PHP 系统功能 内容说明:本函数可将变量转成整数类型。可省略的参数 base 是转换的基底&#xff0c;默认值为 10。转换的变量 var 可以为数组或类之外的任何类型变量。转载于:htt…

python桌面应用html_是否将Python后端与HTML / CSS / JS用户界面集成到桌面应用程序? - javascript...

在创建桌面应用程序时&#xff0c;如何或将Python代码与HTML / CSS / JS集成为用户界面&#xff0c;该如何做&#xff1f;一个简单的例子&#xff1b;如果我想用Python创建一个打印“ Hello World&#xff01;”的函数并使用HTML / CSS / JS创建用户界面(使其精美&#xff0c;也…

linux中按行读取文件,Linux按行读取文件内容

方法1&#xff1a;while循环中执行效率最高&#xff0c;最常用的方法。function while_read_LINE_bottm(){While read LINEdoecho $LINEdone < $FILENAME}#!/bin/bashwhile read linedoecho $linedone < filename(待读取的文件)注释&#xff1a;习惯把这种方式叫做read釜…

Visual C++ 基础数据类型的转换

16.1如何将基本数据类型转换成CString类型 用CString的Format方法 void CDemoView::OnDraw(CDC* pDC) {int a 100;double b 1.23;//将整型转换成CStringCString str1 _T("");str1.Format(_T("%d"), a);//将实型转换成CStringCString str2 _T("&qu…

python 片段_python片段程序

from PIL import Imageimport re#给图片添加一层蒙版&#xff0c;可以设置位置&#xff0c;尺寸&#xff0c;颜色&#xff0c;透明度def img_add_glass(img,new_imgglass,glass_factor0.3,glass_color#ffffff,glass_x0,glass_y0,glass_width300,glass_height100):imageobjectif…

linux ruby 安装路径,Linux(CentOS 7)安装ruby

首先下载Linux版ruby源码“ruby-2.7.0.tar.gz”&#xff0c;上传并解压到/usr/local路径下&#xff1a;tar -xzvf ruby-2.7.0.tar.gz安装编译依赖工具&#xff0c;gcc、gcc-c、gdbm-devel、readline-devel和openssl-devel&#xff1a;yum install gccyum install gcc-cyum inst…

开心一笑

1转载于:https://www.cnblogs.com/luquanmingren/p/4261912.html