リンクされた画像をダウンロードしてアップロードするJavaScriptの実装

リンクされた画像をダウンロードしてアップロードするJavaScriptの実装

写真をアップロードするので、まずはダウンロード可能な画像リソースかどうかを判断する必要があります。正規表現を使用できる場合もありますが、ダウンロード可能かどうかを判断するのは困難です。また、画像リンクの後にサフィックスがあるかどうかを判断することも困難です。サフィックスがない画像もありますが、この制限が解除されると攻撃されやすくなります。そのため、ここでは判定方法として Image を使用します。画像が正常に読み込まれた場合、それは確かに画像であり、ダウンロードできることを意味します。

// リンクが画像を指していてダウンロード可能かどうかを確認します export const checkImgExists = (imgurl: string) => {
 新しいPromise(function(resolve,reject))を返す{
  var ImgObj = 新しいイメージ();
  ::= ::= .src = .imgurl;
  ImgObj.onload = 関数 (res) {
   解決する(res);
  };
  ImgObj.onerror = 関数 (err) {
   拒否(エラー);
  };
 });
};

// 使い方
checkImgExists(画像リンク)
 .then(() => {
  // imgLink を使って何かする
  コンソールログ(画像リンク);
 })
 .catch((エラー) => {
  // ログまたはアラーム
  コンソールログ(エラー);
  console.log("申し訳ありませんが、このリンクでは画像を取得できません");
 });

判断が終わったら、画像をダウンロードする必要があります。ここでは XMLHttpRequest を使用してダウンロードを要求し、ダウンロードされた画像は Blob オブジェクトになります。

Blob 自体は FormData オブジェクトまたは File オブジェクトに変換できます。プロジェクトの特定の状況に応じてアップロード戦略を選択できます。OSS にアップロードする場合は、File オブジェクトに変換することを選択できます。独自のサーバーに転送する場合は、Ajax を使用して Blob を FormData に変換してアップロードできます。

// 画像リンク内の画像に対してXMLHttpRequestリクエストを行い、Blobオブジェクトを返します。function getImageBlob(url: string) {
 新しいPromise(function(resolve,reject))を返す{
  var xhr = 新しい XMLHttpRequest();
  xhr.open("get", url, true);
  xhr.responseType = "blob";
  xhr.onload = 関数 () {
   (このステータス == 200)の場合{
    応答を解決します。
   }
  };
  xhr.onerror = 拒否;
  xhr.send();
 });
}

// Blob オブジェクトを File オブジェクトに変換します const blobToFile = (blob: Blob, fileName: string) => {
 新しい window.File([blob], fileName, { type: blob.type }) を返します。
};

// 使い方
// アップロード操作に使用できる File オブジェクトを返します getImageBlob(src).then(async (res: any) => {
 const srcSplit = src.split("/");
 const ファイル名 = srcSplit[srcSplit.length - 1];
 blobToFile(res, ファイル名) を返します。
});

以下は、OSS をアップロードする簡単なデモンストレーションです。OSS には多くの個人情報が含まれるため、accessKeyId や accessKeySecret などの情報を取得するインターフェースを使用するか、一時キーを使用することをお勧めします。

「ali-oss」からOSSをインポートします。

const ERROR_TIP = "アップロードに失敗しました!";

/**
 * OSS にファイルをアップロードする例* 関連する accessKeyId、バケット、その他のパラメータは、OSS ライブラリに従って入力する必要があります* 2 つの機密情報 [accessKeyId、accessKeySecret] を取得または暗号化するためのインターフェイスにすることをお勧めします*/
エクスポートconst uploadToOSS = async (
 ファイル名: 文字列、
 ファイル: ファイル、
 アクセスキーID: 文字列、
 accessKeySecret: 文字列、
 ...小道具
) => {
 クライアント = 新しいOSS({
  エンドポイント、// 申請した OSS プロジェクト アドレス バケット、// OSS オブジェクト キャリア accessKeyId、// OSS の accessKeyId
  accessKeySecret、// OSS の accessKeySecret
  内部: true、
  ...小道具、
 });
 const putResult = await client.put(fileName, ファイル, {
  タイムアウト: 60 * 1000 * 2、
 });
 (putResult.res.status === 200)の場合{
  戻り値: putResult.url, fileName };
 }
 新しいエラー(ERROR_TIP)をスローします。
};

もちろん、独自のサーバーに写真をアップロードする場合は、Blob 形式のファイルを FormData 形式に変換し、XMLHttpRequest または Ajax を使用して写真をアップロードすることもできます。

// Blob オブジェクトを FormData オブジェクトに変換します。const blobToFormData = (blob: Blob, fileName: string) => {
 定数フォームデータ = 新しい FormData();
 formdata.append("ファイル", blob, ファイル名);
 フォームデータを返します。
};

// XMLHttpリクエスト
const uploadFile = (formData: FormData) => {
 const url = "your_interface";
 xhr = new XMLHttpRequest();
 xhr.onload = 関数 () {
  console.log("OK");
  console.log(JSON.parse(xhr.responseText));
 };
 xhr.onerror = 関数(){
  console.log("失敗");
 };
 xhr.open("post", url, true);
 xhr.send(フォームデータ);
};

// アヤックス
const uploadFile2 = (formData: FormData) => {
 const url = "your_interface";
 $.ajax({
  URL、
  タイプ: "POST",
  データ: フォームデータ、
  非同期: false、
  キャッシュ: false、
  コンテンツタイプ: false、
  プロセスデータ: false、
  成功: 関数 (returndata) {
   console.log(戻りデータ);
  },
  エラー: 関数 (returndata) {
   console.log(戻りデータ);
  },
 });
};

以前のバックエンド プロジェクトでは、Express を静的画像ライブラリとして使用しました。以下は、画像をアップロードするためのノード コードです。注目すべきは、強力な解析を使用した後、jpg ファイルはプリセット写真ディレクトリ内で直接長いランダムな名前を持つということです。実際、ここでも名前変更に短い名前を使用しました。必要に応じて名前変更戦略を選択できます。

定数 express = require("express");
定数 listenNumber = 5000;
express() は、定数です。
bodyParser は、次のコードで定義されます。
const http = require("http"); // サーバーを作成する const formidable = require("formidable");
定数パス = require("パス");
定数 fs = require("fs");
app.use(express.static("../../upload"));
app.use(bodyParser.urlencoded({extended: false }));
app.use(bodyParser.json()); //データ JSON タイプ // 画像のアップロード app.post("/upLoadArticlePicture", (req, res, next) => {
 defaultPath を "../../upload/" とします。
 uploadDir = path.join(__dirname, defaultPath); とします。
 フォームを新しい formidable.IncomingForm() にします。
 getRandomID = () を実行します =>
  数値(Math.random().toString().substr(4, 10) + Date.now()).toString(36);
 form.uploadDir = uploadDir; //アップロードされたファイルのキャッシュディレクトリを設定します form.encoding = "utf-8"; //編集を設定します form.keepExtensions = true; //サフィックスを保持します form.maxFieldsSize = 2 * 1024 * 1024; //ファイルサイズ form.parse(req, function (err, fields, files) {
  もし(エラー){
   res.locals.error = err;
   res.render("index", { title: TITLE });
   戻る;
  }
  filePath = files.file["path"]とします。
  backName = filePath.split(".")[1]とします。
  oldPath を filePath.split("\\")[filePath.split("\\").length - 1] とします。
  newPath = `${getRandomID()}.${backName}` とします。
  fs.rename(defaultPath + oldPath, defaultPath + newPath, (err) => {
   もしエラーが起きたら
    newPath = `http://localhost:${listenNumber}/${newPath}`;
    res.json({ フラグ: true、パス: newPath });
   } それ以外 {
    res.json({ フラグ: false、パス: "" });
   }
  });
 });
});

これで、JavaScript によるリンク画像のダウンロードとアップロードの実装に関する記事は終了です。JavaScript によるリンク画像のダウンロードとアップロードの関連コンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • ファイルのアップロードとダウンロードクラスコードを実現するJSPページ
  • ファイルのアップロードとダウンロードを実装する JSP プログラムの例
  • jsp ファイルのアップロードとダウンロードのサンプルコード
  • アップロードされたファイルによって返されるJSONデータは、問題の解決策をダウンロードするように求められます。
  • WeChat Javaはjs-sdk画像のアップロードとダウンロードの完全なプロセスを実装します
  • ネイティブjsは、ファイルのアップロード、ダウンロード、パッケージ化などのサンプルメソッドを実装します。

<<:  Linux仮想マシンの静的IPアドレスを構成するための手順を完了します

>>:  MySQLを使用して列内の異なる値の数をカウントする例

推薦する

MySQL パフォーマンス ストレス ベンチマーク ツール sysbench の使い方の紹介

目次1. sysbenchの紹介#プロジェクトダウンロードアドレス: 2. Sysbenchのインス...

MongoDB データベースの状態を監視する Zabbix3.4 メソッド

Mongodb には db.serverStatus() コマンドがあり、これを使用して Mongo...

MySQLのファジークエリの要約

1. 一般的な使用法: (1)%で使用する% は 1 つ以上の文字のワイルドカードを表します。たとえ...

Centos7 で yum を使用して Mysql5.7.19 をインストールする詳細な手順

Centos7 の yum ソースには、mysql の代わりに mariaDB が使用されているため...

MySQL ロール関数の紹介

目次序文: 1. 役割の紹介2. 役割に関連する操作要約:序文:前回の記事では、MySQLの権限管理...

MYSQL大規模書き込み問題の最適化の詳細な説明

概要: MySQL のパフォーマンス最適化について話すとき、誰もがクエリ パフォーマンスを向上させる...

MySQL DEFINER の使用方法の詳細な説明

目次序文: 1.DEFINERの簡単な紹介2. いくつかの注意点要約:序文: MySQL データベー...

Vueルーティングナビゲーションガードの簡単な理解

目次1. グローバルガード1. グローバル前線警備2. グローバル解像度ガード3. グローバルポスト...

よく使われるシングルページアプリケーションウェブサイト共有

CSS3お願いしますこのウェブサイトを自分で見て、パラメータを変更し、CSS3効果をオン/オフにする...

jQuery キャンバスは QR コード付きのポスターを生成します

この記事では、jQuery キャンバスを使用して QR コード付きのポスターを生成するための具体的な...

デザインにおいて無視できないインタラクティブデザインにおける製品状態の分析

製品デザインのプロセスにおいて、デザイナーは常に写真を非常に美しくすることを好みます。仮想ページのコ...

Dockerはローカルディレクトリとデータボリュームコンテナ操作をマウントします

1. DockerはローカルディレクトリをマウントしますDocker は、ホスト上のディレクトリをイ...

MySQLデータ行と行オーバーフローのメカニズムの詳細な説明

1. 行の形式は何ですか? MySQL の行形式の設定は次のように表示されます。 実際、MySQL ...

HTML でフレームセット タグを使用するチュートリアル

フレームセット ページは通常の Web ページとは多少異なります。依然として <HTML>...

JavaScript に関する 6 つの奇妙で便利な点

目次1. 解体のヒント2. デジタルセパレーター3. try...catch...finally が...