最新发布
JavaScript 如何下载图片
我们在浏览器使用JavaScript下载图片的时候;通常会想到使用window.location.href=imgUrl或者window.open(imgUrl);但是有时候我们会发现图片会在浏览器打开;而达不到我们想要的下载效果;于是通过调研;下面总结了两种图片下载的方法前置代码下载图片前首先在JavaScript通过new Image()的方式加载图片;然后再对图片做转换,转换包括图片转base64,base64转blob等;然后对转换之后的图片资源进行下载。下面直接上代码。// 加载图片
async function loadImage (params) {
// 图片src 必传
let src = params.src
return new Promise((resolve, reject) => {
let img = new Image()
img.src = src
img.crossOrigin = 'anonymous'
img.onload = () => {
resolve(img)
}
img.onerror = reject
})
}
// 图片转base64
function img2Base64 (image) {
// 图片画到canvas
const canvas = document.createElement('canvas');
canvas.width = image.width;
canvas.height = image.height;
const context = canvas.getContext('2d');
context.drawImage(image, 0, 0);
return canvas.toDataURL('image/png', 1.0)
}
// base64转blob
function base64ToBlob (base64Code) {
let parts = base64Code.split(';base64,')
let contentType = parts[0].split(':')[1]
let raw = window.atob(parts[1])
let rawLength = raw.length
let uInt8Array = new Uint8Array(rawLength)
for (let i = 0; i < rawLength; ++i) {
uInt8Array[i] = raw.charCodeAt(i)
}
return new Blob([uInt8Array], {
type: contentType
})
}
// 下载资源
function downloadFile(href, filename) {
const link = document.createElement('a');
link.href = href;
link.download = filename;
link.setAttribute('type', 'application/octet-stream');
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
}下载图片代码方法一;先加载图片,再把图片转base64,再下载base64。方法二;先加载图片,再把图片转base64,再把base64转blob,再下载blob。// 1;先加载图片,再把图片转base64,再下载base64
async function downloadImg1(imageUrl) {
const image = await loadImage({src: imageUrl})
let base64 = img2Base64(image)
// 下载图片
downloadFile(base64, 'file.png');
}
// 2;先加载图片,再把图片转base64,再把base64转blob,再下载blob
async function downloadImg2(imageUrl) {
const image = await loadImage({src: imageUrl})
let base64 = img2Base64(image)
let blob = base64ToBlob(base64)
// 下载图片
downloadFile(URL.createObjectURL(blob), 'file.png');
}
// 示例
downloadImg1('https://xyhnnx.gitee.io/img/getdoc.png');
downloadImg2('https://xyhnnx.gitee.io/img/getdoc.png');可能遇到的报错如果遇到这个错误:Access to image at 'xx' from origin 'xx' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.这个错误提示通常是由于遵循同源策略而引起的,它防止JavaScript代码从不同的源(域名、协议或端口)获取数据。如果试图从另一个域名下加载图像,即在跨域请求图片时,由于CORS限制,浏览器可能会拒绝显示该图像并抛出这个错误。要解决这个问题,您可以使用下面的任一方法:将图像文件存放在与您的网站相同的主机上,或者使用基于相对路径的URL。这将避免跨域问题。如果必须从不同的域名或主机加载图像,您需要在相关的服务器上设置Access-Control-Allow-Origin标头,在响应中包含允许访问资源的域名。例如,在HTTP响应中添加以下标头可以允许所有域名访问图片:Access-Control-Allow-Origin: *如果您无法在服务器上进行更改,可以尝试使用代理来获取图像数据。例如,您可以在您的服务器上设置代理,在代理中请求图像,而不是直接从浏览器中请求。这将避免跨域问题。总之,CORS问题通常涉及到服务器、响应头或代理,您可以根据实际情况选择相应的解决方案来解决这个问题。
async function loadImage (params) {
// 图片src 必传
let src = params.src
return new Promise((resolve, reject) => {
let img = new Image()
img.src = src
img.crossOrigin = 'anonymous'
img.onload = () => {
resolve(img)
}
img.onerror = reject
})
}
// 图片转base64
function img2Base64 (image) {
// 图片画到canvas
const canvas = document.createElement('canvas');
canvas.width = image.width;
canvas.height = image.height;
const context = canvas.getContext('2d');
context.drawImage(image, 0, 0);
return canvas.toDataURL('image/png', 1.0)
}
// base64转blob
function base64ToBlob (base64Code) {
let parts = base64Code.split(';base64,')
let contentType = parts[0].split(':')[1]
let raw = window.atob(parts[1])
let rawLength = raw.length
let uInt8Array = new Uint8Array(rawLength)
for (let i = 0; i < rawLength; ++i) {
uInt8Array[i] = raw.charCodeAt(i)
}
return new Blob([uInt8Array], {
type: contentType
})
}
// 下载资源
function downloadFile(href, filename) {
const link = document.createElement('a');
link.href = href;
link.download = filename;
link.setAttribute('type', 'application/octet-stream');
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
}下载图片代码方法一;先加载图片,再把图片转base64,再下载base64。方法二;先加载图片,再把图片转base64,再把base64转blob,再下载blob。// 1;先加载图片,再把图片转base64,再下载base64
async function downloadImg1(imageUrl) {
const image = await loadImage({src: imageUrl})
let base64 = img2Base64(image)
// 下载图片
downloadFile(base64, 'file.png');
}
// 2;先加载图片,再把图片转base64,再把base64转blob,再下载blob
async function downloadImg2(imageUrl) {
const image = await loadImage({src: imageUrl})
let base64 = img2Base64(image)
let blob = base64ToBlob(base64)
// 下载图片
downloadFile(URL.createObjectURL(blob), 'file.png');
}
// 示例
downloadImg1('https://xyhnnx.gitee.io/img/getdoc.png');
downloadImg2('https://xyhnnx.gitee.io/img/getdoc.png');可能遇到的报错如果遇到这个错误:Access to image at 'xx' from origin 'xx' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.这个错误提示通常是由于遵循同源策略而引起的,它防止JavaScript代码从不同的源(域名、协议或端口)获取数据。如果试图从另一个域名下加载图像,即在跨域请求图片时,由于CORS限制,浏览器可能会拒绝显示该图像并抛出这个错误。要解决这个问题,您可以使用下面的任一方法:将图像文件存放在与您的网站相同的主机上,或者使用基于相对路径的URL。这将避免跨域问题。如果必须从不同的域名或主机加载图像,您需要在相关的服务器上设置Access-Control-Allow-Origin标头,在响应中包含允许访问资源的域名。例如,在HTTP响应中添加以下标头可以允许所有域名访问图片:Access-Control-Allow-Origin: *如果您无法在服务器上进行更改,可以尝试使用代理来获取图像数据。例如,您可以在您的服务器上设置代理,在代理中请求图像,而不是直接从浏览器中请求。这将避免跨域问题。总之,CORS问题通常涉及到服务器、响应头或代理,您可以根据实际情况选择相应的解决方案来解决这个问题。
Nodejs 获取指定文件夹下所有文件及文件夹
做项目时候经常会遇到获取本地某个文件夹下所有内容的情况;下面简单列举两种方法。## 方法一 文件及文件夹扁平化输出
### 代码
```javascript
const fs = require('fs');
function getFilesAndFoldersInDir(path) {
const items = fs.readdirSync(path);
const result = [];
items.forEach(item => {
const itemPath = `${path}/${item}`;
const stat = fs.statSync(itemPath);
if (stat.isDirectory()) {
let data = {
// 文件夹
type: 'folder',
name: item
}
let children = getFilesAndFoldersInDir(itemPath)
if (children && children.length) {
data.children = children
}
result.push(data);
} else {
// 文件
result.push({
type: 'file',
name: item
});
}
});
return result;
}
let list = getFilesAndFoldersInDir('/jay')
console.log(list)输出结构[
{
"size": 1224860,
"name": "周杰伦-Intro.mp3",
"path": "/jay/《最伟大的作品》专辑MP3/目录1/周杰伦-Intro.mp3"
},
{
"size": 7432949,
"name": "周杰伦-Mojito.mp3",
"path": "/jay/《最伟大的作品》专辑MP3/目录1/周杰伦-Mojito.mp3"
},
{
"size": 9866516,
"name": "周杰伦-不爱我就拉倒.mp3",
"path": "/jay/《最伟大的作品》专辑MP3/目录1/周杰伦-不爱我就拉倒.mp3"
},
{
"size": 9401524,
"name": "周杰伦-倒影.mp3",
"path": "/jay/《最伟大的作品》专辑MP3/目录1/周杰伦-倒影.mp3"
},
{
"size": 10831295,
"name": "周杰伦-等你下课 (with 杨瑞代).mp3",
"path": "/jay/《最伟大的作品》专辑MP3/目录1/周杰伦-等你下课 (with 杨瑞代).mp3"
},
{
"size": 10346118,
"name": "周杰伦-错过的烟火.mp3",
"path": "/jay/《最伟大的作品》专辑MP3/目录1/周杰伦-错过的烟火.mp3"
},
{
"size": 10687350,
"name": "周杰伦-我是如此相信.mp3",
"path": "/jay/《最伟大的作品》专辑MP3/目录2/周杰伦-我是如此相信.mp3"
},
{
"size": 9794418,
"name": "周杰伦-最伟大的作品.mp3",
"path": "/jay/《最伟大的作品》专辑MP3/目录2/周杰伦-最伟大的作品.mp3"
},
{
"size": 7504609,
"name": "周杰伦-粉色海洋.mp3",
"path": "/jay/《最伟大的作品》专辑MP3/目录2/周杰伦-粉色海洋.mp3"
},
{
"size": 10316859,
"name": "周杰伦-红颜如霜.mp3",
"path": "/jay/《最伟大的作品》专辑MP3/目录2/周杰伦-红颜如霜.mp3"
},
{
"size": 8926108,
"name": "周杰伦-说好不哭 (with 五月天阿信).mp3",
"path": "/jay/《最伟大的作品》专辑MP3/目录2/周杰伦-说好不哭 (with 五月天阿信).mp3"
},
{
"size": 10664502,
"name": "周杰伦-还在流浪.mp3",
"path": "/jay/《最伟大的作品》专辑MP3/目录2/周杰伦-还在流浪.mp3"
}
]方法二 文件及文件夹以树状结构输出代码// 获取文件夹下所有文件
function getFilesAndFoldersInDir(path) {
const filesList = [];
readFile(path, filesList);
return filesList;
}
// 遍历读取文件
function readFile(path, filesList) {
const files = fs.readdirSync(path); // 需要用到同步读取
files.forEach(walk);
function walk(file) {
const states = fs.statSync(path + '/' + file);
if (states.isDirectory()) {
readFile(path + '/' + file, filesList);
} else {
// 创建一个对象保存信息
const obj = {};
obj.size = states.size; // 文件大小,以字节为单位
obj.name = file; // 文件名
obj.path = path + '/' + file; // 文件绝对路径
filesList.push(obj);
}
}
}
let list = getFilesAndFoldersInDir('/jay')
console.log(list)输出结构[ { "type": "folder", "name": "《最伟大的作品》专辑MP3", "children": [ { "type": "folder", "name": "目录1", "children": [ { "type": "file", "name": "周杰伦-Intro.mp3" }, { "type": "file", "name": "周杰伦-Mojito.mp3" }, { "type": "file", "name": "周杰伦-不爱我就拉倒.mp3" }, { "type": "file", "name": "周杰伦-倒影.mp3" }, { "type": "file", "name": "周杰伦-等你下课 (with 杨瑞代).mp3" }, { "type": "file", "name": "周杰伦-错过的烟火.mp3" } ] }, { "type": "folder", "name": "目录2", "children": [ { "type": "file", "name": "周杰伦-我是如此相信.mp3" }, { "type": "file", "name": "周杰伦-最伟大的作品.mp3" }, { "type": "file", "name": "周杰伦-粉色海洋.mp3" }, { "type": "file", "name": "周杰伦-红颜如霜.mp3" }, { "type": "file", "name": "周杰伦-说好不哭 (with 五月天阿信).mp3" }, { "type": "file", "name": "周杰伦-还在流浪.mp3" } ] } ] }]
### 代码
```javascript
const fs = require('fs');
function getFilesAndFoldersInDir(path) {
const items = fs.readdirSync(path);
const result = [];
items.forEach(item => {
const itemPath = `${path}/${item}`;
const stat = fs.statSync(itemPath);
if (stat.isDirectory()) {
let data = {
// 文件夹
type: 'folder',
name: item
}
let children = getFilesAndFoldersInDir(itemPath)
if (children && children.length) {
data.children = children
}
result.push(data);
} else {
// 文件
result.push({
type: 'file',
name: item
});
}
});
return result;
}
let list = getFilesAndFoldersInDir('/jay')
console.log(list)输出结构[
{
"size": 1224860,
"name": "周杰伦-Intro.mp3",
"path": "/jay/《最伟大的作品》专辑MP3/目录1/周杰伦-Intro.mp3"
},
{
"size": 7432949,
"name": "周杰伦-Mojito.mp3",
"path": "/jay/《最伟大的作品》专辑MP3/目录1/周杰伦-Mojito.mp3"
},
{
"size": 9866516,
"name": "周杰伦-不爱我就拉倒.mp3",
"path": "/jay/《最伟大的作品》专辑MP3/目录1/周杰伦-不爱我就拉倒.mp3"
},
{
"size": 9401524,
"name": "周杰伦-倒影.mp3",
"path": "/jay/《最伟大的作品》专辑MP3/目录1/周杰伦-倒影.mp3"
},
{
"size": 10831295,
"name": "周杰伦-等你下课 (with 杨瑞代).mp3",
"path": "/jay/《最伟大的作品》专辑MP3/目录1/周杰伦-等你下课 (with 杨瑞代).mp3"
},
{
"size": 10346118,
"name": "周杰伦-错过的烟火.mp3",
"path": "/jay/《最伟大的作品》专辑MP3/目录1/周杰伦-错过的烟火.mp3"
},
{
"size": 10687350,
"name": "周杰伦-我是如此相信.mp3",
"path": "/jay/《最伟大的作品》专辑MP3/目录2/周杰伦-我是如此相信.mp3"
},
{
"size": 9794418,
"name": "周杰伦-最伟大的作品.mp3",
"path": "/jay/《最伟大的作品》专辑MP3/目录2/周杰伦-最伟大的作品.mp3"
},
{
"size": 7504609,
"name": "周杰伦-粉色海洋.mp3",
"path": "/jay/《最伟大的作品》专辑MP3/目录2/周杰伦-粉色海洋.mp3"
},
{
"size": 10316859,
"name": "周杰伦-红颜如霜.mp3",
"path": "/jay/《最伟大的作品》专辑MP3/目录2/周杰伦-红颜如霜.mp3"
},
{
"size": 8926108,
"name": "周杰伦-说好不哭 (with 五月天阿信).mp3",
"path": "/jay/《最伟大的作品》专辑MP3/目录2/周杰伦-说好不哭 (with 五月天阿信).mp3"
},
{
"size": 10664502,
"name": "周杰伦-还在流浪.mp3",
"path": "/jay/《最伟大的作品》专辑MP3/目录2/周杰伦-还在流浪.mp3"
}
]方法二 文件及文件夹以树状结构输出代码// 获取文件夹下所有文件
function getFilesAndFoldersInDir(path) {
const filesList = [];
readFile(path, filesList);
return filesList;
}
// 遍历读取文件
function readFile(path, filesList) {
const files = fs.readdirSync(path); // 需要用到同步读取
files.forEach(walk);
function walk(file) {
const states = fs.statSync(path + '/' + file);
if (states.isDirectory()) {
readFile(path + '/' + file, filesList);
} else {
// 创建一个对象保存信息
const obj = {};
obj.size = states.size; // 文件大小,以字节为单位
obj.name = file; // 文件名
obj.path = path + '/' + file; // 文件绝对路径
filesList.push(obj);
}
}
}
let list = getFilesAndFoldersInDir('/jay')
console.log(list)输出结构[ { "type": "folder", "name": "《最伟大的作品》专辑MP3", "children": [ { "type": "folder", "name": "目录1", "children": [ { "type": "file", "name": "周杰伦-Intro.mp3" }, { "type": "file", "name": "周杰伦-Mojito.mp3" }, { "type": "file", "name": "周杰伦-不爱我就拉倒.mp3" }, { "type": "file", "name": "周杰伦-倒影.mp3" }, { "type": "file", "name": "周杰伦-等你下课 (with 杨瑞代).mp3" }, { "type": "file", "name": "周杰伦-错过的烟火.mp3" } ] }, { "type": "folder", "name": "目录2", "children": [ { "type": "file", "name": "周杰伦-我是如此相信.mp3" }, { "type": "file", "name": "周杰伦-最伟大的作品.mp3" }, { "type": "file", "name": "周杰伦-粉色海洋.mp3" }, { "type": "file", "name": "周杰伦-红颜如霜.mp3" }, { "type": "file", "name": "周杰伦-说好不哭 (with 五月天阿信).mp3" }, { "type": "file", "name": "周杰伦-还在流浪.mp3" } ] } ] }]
出师表
先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。然侍卫之臣不懈于内,忠志之士忘身于外者,盖追先帝之殊遇,欲报之于陛下也。诚宜开张圣听,以光先帝遗德,恢弘志士之气,不宜妄自菲薄,引喻失义,以塞忠谏之路也。宫中府中,俱为一体,陟罚臧否,不宜异同。若有作奸犯科及为忠善者,宜付有司论其刑赏,以昭陛下平明之理,不宜偏私,使内外异法也。侍中、侍郎郭攸之、费祎、董允等,此皆良实,志虑忠纯,是以先帝简拔以遗陛下。愚以为宫中之事,事无大小,悉以咨之,然后施行,必能裨补阙漏,有所广益。将军向宠,性行淑均,晓畅军事,试用于昔日,先帝称之曰能,是以众议举宠为督。愚以为营中之事,悉以咨之,必能使行阵和睦,优劣得所。亲贤臣,远小人,此先汉所以兴隆也;亲小人,远贤臣,此后汉所以倾颓也。先帝在时,每与臣论此事,未尝不叹息痛恨于桓、灵也。侍中、尚书、长史、参军,此悉贞良死节之臣,愿陛下亲之信之,则汉室之隆,可计日而待也。臣本布衣,躬耕于南阳,苟全性命于乱世,不求闻达于诸侯。先帝不以臣卑鄙,猥自枉屈,三顾臣于草庐之中,咨臣以当世之事,由是感激,遂许先帝以驱驰。后值倾覆,受任于败军之际,奉命于危难之间,尔来二十有一年矣。先帝知臣谨慎,故临崩寄臣以大事也。受命以来,夙夜忧叹,恐托付不效,以伤先帝之明,故五月渡泸,深入不毛。今南方已定,兵甲已足,当奖率三军,北定中原,庶竭驽钝,攘除奸凶,兴复汉室,还于旧都。此臣所以报先帝而忠陛下之职分也。至于斟酌损益,进尽忠言,则攸之、祎、允之任也。愿陛下托臣以讨贼兴复之效,不效,则治臣之罪,以告先帝之灵。若无兴德之言,则责攸之、祎、允等之慢,以彰其咎;陛下亦宜自谋,以咨诹善道,察纳雅言,深追先帝遗诏,臣不胜受恩感激。今当远离,临表涕零,不知所言。
一款带弹性动画关闭效果的QQ在线客服咨询插件
带弹性动画关闭QQ在线客服代码是一款带弹性动画关闭效果的QQ在线客服咨询插件代码,可设置客服头像和QQ在线客服代码,关闭时会显示弹跳的动画效果,很有趣。经测试效果相当不错!源码由HTML+CSS+JS组成,记事本打开源码文件可以进行内容文字之类的修改,双击html文件可以本地运行效果,也可以上传到服务器里面。https://www.123865.com/s/UUEuVv-KvKgA
“叫“姐姐”已经不流行了,现在都叫这10种称呼”
•小朋友:宠溺感拉满,暗示你永远是我的偏爱。•穿搭老师:用技能贴标签,夸人于无形。•领导:表面认怂,实则撒糖。•小祖宗:嘴上嫌弃,眼里全是纵容。•老板:社畜梗也能变情话。•姐妹:打破性别框架,做她的“最佳闺蜜”。•爱人:已婚人士的浪漫暴击,安全感十足。•仙女本仙:女生永远听不腻的彩虹屁。•宝贝儿:甜蜜感十足,无法拒绝。•女主人:以下属身份,永远追随。
+1
警察叔叔是怎么通过IP定位到你的?
在网络世界中,你的IP地址就像是数字身份证,可以揭示你的位置信息。警方依靠这些数字痕迹,结合专业技术手段和法律程序,能够锁定网络犯罪嫌疑人。让我们揭开IP定位的技术面纱,了解这背后的原理。一、IP与地理位置的关联警方会利用专业的IP地理位置数据库进行定位工作。这些数据库包括:公安专用IP定位数据库第三方商业级IP地址库网络运营商提供的地址映射通过将IP地址与注册信息、网络拓扑数据(如BGP路由表、WHOIS信息)及历史基准点进行匹配分析,系统能够实现相当精确的位置推断:企业IP定位:精确度通常可达50米范围内家庭IP定位:一般精确在1~5公里范围内二、IP与网络接入点的关系当需要更精确定位时,电信运营商可以调取该IP地址对应的网络设备信息:BRAS设备(宽带接入服务器)记录基站位置数据通过这些技术手段,定位精度可以提升至:社区和街道级别条件良好时甚至可精确到具体楼宇三、IP与家庭宽带的精确映射现代网络接入管理中,运营商通常会为每个家庭宽带分配唯一标识:不同家庭的宽带被分配了不同的源IP端口标注源端口范围从0到65535,每个家庭的配置各不相同通过网络请求中的IP和源端口组合,警方可以精确定位到具体住户实用IP定位查询工具如果你想了解自己的IP定位情况,可以尝试以下专业网站:第一个:https://www.chaipip.com/aiwen.html第二个:https://www.ip66.net/ip?tp=1&ip=183.241.x.x趣味知识你是否曾好奇,为什么使用代理或某些苹果设备查询自己位置时,有时会显示在公安局或政府机构附近?这背后可能有什么原因呢?欢迎在评论区分享你的猜测!注:本文仅供网络安全知识普及,请勿用于非法用途。网络不是法外之地,每一个数字足迹都可能被追溯。
“改个癫癫的微信群名称”🦍
1. 少年先疯队2. 祖国的食人花3. 啊对对队4. 商业胡吹彩虹屁总群5. 朵朵奇葩像太阳6. 强盛集团7. 极限X傻8. 帅哥情报局9. 海王之家10. 相侵相碍一家人11. 不醒人事12. 酒精沙场的战士们13. 永瘦宫14. 世界隐形富豪群15. 发际线保护协会16. 单身狗自然保护区
xiuno修罗论坛二开模板仿网盘资源社优化网站源码搭建送全套插件
xiuno修罗论坛二开模板仿网盘资源社优化网站源码搭建送全套插件PHP版本:5.0到7.3之间,推荐7.1,高和低都会出错!https://www.123865.com/s/UUEuVv-uvKgA以服务器为例搭建教程①先安装PHP7.1版本 再安装数据库Mysql②解压文件:xiunobbs_4.0.4(解压到根目录).zip③解压②完成后找到【plugin】文件夹再解压:plugin(解压到plugin文件夹).zip设置伪静态代码在上面,运行安装:域名/install/以酷酷资源社为例(访问你的域名/install/)运行该目录进行数据库安装、连接、设置后台账户和密码搭建就完成了,首次搭建先在后台把所有的插件卸载,再重新安装,安装完再清缓存伪静态:`location ~* .(htm)$ {rewrite “^(.)/(.+?).htm(.?)$” $1/index.php?$2.htm$3 last;}`
2025款高仿新版假飞机假TG源码/以及搭建教程
2025款高仿新版假飞机假TG源码/以及搭建教程,修复了手机号以及86手机号无法登录的问题 修复了BTC地址不能篡改的BUG,源码仅供学习交流使用,具体未测。感兴趣自行下载研究。https://www.123865.com/s/UUEuVv-UvKgA
平台说明
欢迎来到六爱资源网论坛社区!这里是用户交流讨论、分享经验的互动平台。
平台特色:
- 多个专业板块,满足不同讨论需求
- 实时互动交流,建立良好社区氛围
- 精华内容推荐,汇聚优质讨论
- 版主认证机制,确保内容质量
6+
讨论板块
231+
帖子数量
34778+
总阅读量
六爱资源网