リンクされた画像をダウンロードしてアップロードする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を使用して列内の異なる値の数をカウントする例

推薦する

DockerプライベートイメージライブラリとAlibaba CloudオブジェクトストレージOSSの簡単な分析

Docker プライベートイメージライブラリDockerプライベートイメージライブラリとAlibab...

Vue コンポーネントでのアンチシェイクとスロットリングの使用例の分析

入力ボックスへのユーザー入力、ウィンドウのサイズ変更、スクロール、Intersection Obse...

HTML タイトルに二重引用符を追加する方法

<a href="https://www.jb51.net/" title...

XHTML 1.0 リファレンス

機能別に並べ替えNN: このタグをサポートする Netscape の以前のバージョンを示しますIE:...

NginxにおけるRewriteのリダイレクト設定と実践の詳しい解説

1: アドレス書き換えとア​​ドレス転送の意味を理解する。アドレス書き換えとア​​ドレス転送は異なる...

MySQLの起動と接続方法の例分析

目次mysqldの起動方法方法 1: mysqld方法 2: mysqld_safe方法3: mys...

HTMLとXHTML、HTML4とHTML5のタグの違いについて簡単に紹介します。

HTML と XHTML の違い1. XHTML要素は正しくネストされている必要がある2. XHT...

スーパーバイザーウォッチドッグの使い方を3分で学ぶ

ソフトウェアとハ​​ードウェア環境centos7.6.1810 64ビット cat /etc/red...

Vueデータ双方向バインディング実装方法

目次1. はじめに2. コードの実装2.1 目的分析2.2 実装プロセス2.2.1 エントリーコード...

Axios はリクエストをキャンセルし、重複リクエストを回避します

目次起源現状リクエストをキャンセル cancelTokenリクエスト方法の変更重複したリクエストを避...

Dockerデータを完全にクリーンアップする方法

目次定期的に剪定するミラーエビクションコンテナのクリーンアップネットワークソート体積の蒸発完全にクリ...

シングルサインオン制御を実装するためのVueの完全なコード

参考までに、Vue シングル サインオンのデモをご紹介します。詳細を知りたい方のお役に立てれば幸いで...

フックを使用して React コンポーネントを書くときに注意すべき 5 つの点

目次01. レンダリングが不要な場合はuseStateを使用する02. リンクの代わりにrouter...

よくある Linux 英語エラーの中国語翻訳 (初心者必見)

1.コマンドが見つかりません コマンドが見つかりません2. そのようなファイルまたはディレクトリは...

MySQL スケジュールタスク (EVENT イベント) を詳細に設定する方法

目次1. イベントとは何ですか? 2. 「イベント」機能を有効にする1. 機能が有効になっているかど...