JavaScript 下載鏈接圖片后上傳的實(shí)現(xiàn)
既然要進(jìn)行圖片上傳,那么第一時(shí)間當(dāng)然是判斷是否為可下載的圖片資源,有的時(shí)候可以使用正則表達(dá)式,但是很難判斷是否可下載,當(dāng)判斷圖片鏈接后是否有后綴的時(shí)候也比較苦惱,有的圖片是沒(méi)有后綴的,可是如果放開(kāi)這個(gè)限制又比較容易被攻擊,所以這里我們使用 Image 作為判斷手法,若成功加載圖片,那么說(shuō)明確實(shí)為圖片且可下載。
// 判斷鏈接是否指向圖片且可下載
export const checkImgExists = (imgurl: string) => {
return new Promise(function (resolve, reject) {
var ImgObj = new Image();
ImgObj.src = imgurl;
ImgObj.onload = function (res) {
resolve(res);
};
ImgObj.onerror = function (err) {
reject(err);
};
});
};
// how to use it
checkImgExists(imgLink)
.then(() => {
// do something with imgLink
console.log(imgLink);
})
.catch((err) => {
// some log or alarm
console.log(err);
console.log("很抱歉, 該鏈接無(wú)法獲取圖片");
});
判斷好后,我們需要對(duì)這個(gè)圖片進(jìn)行下載,這里我們使用 XMLHttpRequest 進(jìn)行請(qǐng)求下載,下載后會(huì)是一個(gè) Blob 對(duì)象。
Blob 本身可以轉(zhuǎn)化成 FormData 對(duì)象或者是 File 對(duì)象,我們可以根據(jù)自己項(xiàng)目的具體情況去選擇上傳策略,如果想傳到 OSS 上,可以選擇轉(zhuǎn)化為 File 對(duì)象,若是傳輸?shù)阶约旱姆?wù)器上,可以使用 Ajax,并轉(zhuǎn) Blob 為 FormData 進(jìn)行上傳。
// 將圖片鏈接中的圖片進(jìn)行 XMLHttpRequest 請(qǐng)求,返回Blob對(duì)象
function getImageBlob(url: string) {
return new Promise(function (resolve, reject) {
var xhr = new XMLHttpRequest();
xhr.open("get", url, true);
xhr.responseType = "blob";
xhr.onload = function () {
if (this.status == 200) {
resolve(this.response);
}
};
xhr.onerror = reject;
xhr.send();
});
}
// 將Blob對(duì)象轉(zhuǎn)為File對(duì)象
const blobToFile = (blob: Blob, fileName: string) => {
return new window.File([blob], fileName, { type: blob.type });
};
// how to use it
// 返回一個(gè)File對(duì)象,可使用該 File 對(duì)象進(jìn)行上傳操作
getImageBlob(src).then(async (res: any) => {
const srcSplit = src.split("/");
const filename = srcSplit[srcSplit.length - 1];
return blobToFile(res, filename);
});
接下來(lái)是一個(gè)上傳OSS的小演示,由于 OSS 涉及的隱私信息較多,所以建議大家把a(bǔ)ccessKeyId、accessKeySecret等信息用接口去獲取,甚至使用臨時(shí)的鑰匙等。
import OSS from "ali-oss";
const ERROR_TIP = "上傳失?。?;
/**
* File上傳OSS的示例
* 相關(guān)accessKeyId、bucket等參數(shù)需要根據(jù)你的OSS庫(kù)進(jìn)行填寫
* 建議將【accessKeyId,accessKeySecret】這兩個(gè)敏感信息做成接口獲取或者加密
*/
export const uploadToOSS = async (
fileName: string,
file: File,
accessKeyId: string,
accessKeySecret: string,
...props
) => {
let client = new OSS({
endpoint, // 你申請(qǐng)好的oss項(xiàng)目地址
bucket, // OSS 對(duì)象載體
accessKeyId, // your accessKeyId with OSS
accessKeySecret, // your accessKeySecret with OSS
internal: true,
...props,
});
const putResult = await client.put(fileName, file, {
timeout: 60 * 1000 * 2,
});
if (putResult.res.status === 200) {
return { url: putResult.url, fileName };
}
throw new Error(ERROR_TIP);
};
當(dāng)然如果想上傳圖片到你自己的服務(wù)器,可以選擇將 Blob 格式的文件轉(zhuǎn)為 FormData 格式,使用 XMLHttpRequest 或者 Ajax 進(jìn)行圖片的上傳
// 將Blob對(duì)象轉(zhuǎn)為FormData對(duì)象
const blobToFormData = (blob: Blob, fileName: string) => {
const formdata = new FormData();
formdata.append("file", blob, fileName);
return formdata;
};
// XMLHttpRequest
const uploadFile = (formData: FormData) => {
const url = "your_interface";
let xhr = new XMLHttpRequest();
xhr.onload = function () {
console.log("ok");
console.log(JSON.parse(xhr.responseText));
};
xhr.onerror = function () {
console.log("fail");
};
xhr.open("post", url, true);
xhr.send(formData);
};
// Ajax
const uploadFile2 = (formData: FormData) => {
const url = "your_interface";
$.ajax({
url,
type: "POST",
data: formData,
async: false,
cache: false,
contentType: false,
processData: false,
success: function (returndata) {
console.log(returndata);
},
error: function (returndata) {
console.log(returndata);
},
});
};
在之前我的后端項(xiàng)目中,使用了 Express 作為靜態(tài)圖片庫(kù),以下是我的 node 上傳圖片代碼。值得注意的是,使用 formidable 解析后,jpg 文件會(huì)直接在你的預(yù)設(shè)照片目錄有一個(gè)很長(zhǎng)的隨機(jī)名稱,這邊其實(shí)我也是使用了較短的名稱進(jìn)行重命名,大家可以根據(jù)自己的需要選擇重命名策略。
const express = require("express");
const listenNumber = 5000;
const app = express();
const bodyParser = require("body-parser");
const http = require("http"); //創(chuàng)建服務(wù)器的
const formidable = require("formidable");
const path = require("path");
const fs = require("fs");
app.use(express.static("../../upload"));
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json()); //數(shù)據(jù)JSON類型
// 上傳圖片
app.post("/upLoadArticlePicture", (req, res, next) => {
let defaultPath = "../../upload/";
let uploadDir = path.join(__dirname, defaultPath);
let form = new formidable.IncomingForm();
let getRandomID = () =>
Number(Math.random().toString().substr(4, 10) + Date.now()).toString(36);
form.uploadDir = uploadDir; //設(shè)置上傳文件的緩存目錄
form.encoding = "utf-8"; //設(shè)置編輯
form.keepExtensions = true; //保留后綴
form.maxFieldsSize = 2 * 1024 * 1024; //文件大小
form.parse(req, function (err, fields, files) {
if (err) {
res.locals.error = err;
res.render("index", { title: TITLE });
return;
}
let filePath = files.file["path"];
let backName = filePath.split(".")[1];
let oldPath = filePath.split("\\")[filePath.split("\\").length - 1];
let newPath = `${getRandomID()}.${backName}`;
fs.rename(defaultPath + oldPath, defaultPath + newPath, (err) => {
if (!err) {
newPath = `http://localhost:${listenNumber}/${newPath}`;
res.json({ flag: true, path: newPath });
} else {
res.json({ flag: false, path: "" });
}
});
});
});
到此這篇關(guān)于JavaScript 下載鏈接圖片后上傳的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)JavaScript 下載鏈接圖片后上傳內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Javascript將數(shù)字轉(zhuǎn)化成為貨幣格式字符串
這篇文章主要介紹Javascript將數(shù)字轉(zhuǎn)化成為貨幣格式字符串的方法,通俗易懂,需要的朋友可以參考下。2016-06-06
layui 對(duì)table中的數(shù)據(jù)進(jìn)行轉(zhuǎn)義的實(shí)例
今天小編就為大家分享一篇layui 對(duì)table中的數(shù)據(jù)進(jìn)行轉(zhuǎn)義的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-09-09
詳解小程序如何避免多次點(diǎn)擊,重復(fù)觸發(fā)事件
這篇文章主要介紹了詳解小程序如何避免多次點(diǎn)擊,重復(fù)觸發(fā)事件,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-04-04
原生Js與jquery的多組處理, 僅展開(kāi)一個(gè)區(qū)塊的折疊效果
同一個(gè)頁(yè)面, 有多組(不固定), 每組區(qū)塊數(shù)量不一定一樣的小區(qū)塊. 要求每次只展開(kāi)一個(gè)區(qū)塊,需要的朋友可以參考下。2011-01-01
JavaScript模塊規(guī)范之AMD規(guī)范和CMD規(guī)范
本篇文章給大家介紹js模塊規(guī)范之AMD規(guī)范和CMD規(guī)范,模塊化是一種處理復(fù)雜系統(tǒng)分解為代碼結(jié)構(gòu)更合理,可維護(hù)性更高的可管理的模塊的方式,對(duì)js amd cmd規(guī)范感興趣的童鞋可以來(lái)本文學(xué)習(xí)2015-10-10
值得分享和收藏的xmlplus組件學(xué)習(xí)教程
值得分享和收藏的xmlplus組件學(xué)習(xí)教程,xmlplus是一個(gè)設(shè)計(jì)非常獨(dú)特 JavaScript 框架,用于快速開(kāi)發(fā)前后端項(xiàng)目,感興趣的小伙伴們可以參考一下2017-05-05
JS實(shí)現(xiàn)超炫網(wǎng)頁(yè)煙花動(dòng)畫效果的方法
這篇文章主要介紹了JS實(shí)現(xiàn)超炫網(wǎng)頁(yè)煙花動(dòng)畫效果的方法,實(shí)例分析了javascript實(shí)現(xiàn)煙花動(dòng)畫效果的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03
使用JS的DOM文檔對(duì)象模型獲取前端循環(huán)的參數(shù)
這篇文章主要介紹了使用JS的DOM(文檔對(duì)象模型)獲取前端循環(huán)的參數(shù),本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02
基于Bootstrap3表格插件和分頁(yè)插件實(shí)例詳解
這篇文章主要介紹了基于Bootstrap3表格插件和分頁(yè)插件實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2016-05-05

