リンクされた画像をダウンロードしてアップロードする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 5.7 でルートパスワードを忘れた後に変更する方法の詳細なチュートリアル

序文長い間、MySQL のアプリケーションおよび学習環境は MySQL 5.6 以前のバージョンであ...

MySQLのスペースをクリーンアップするいくつかの具体的な方法

目次序文1. ファイルのディスク使用量を確認する1.1 ディスク容量の使用状況を確認する1.2 ディ...

ラベルとボタンを削除し、背景画像の点線/影を追加すると完璧な解決策になります

ユーザーが登録すると、ラベルをクリックして確認コードを変更します。クリックするとラベルに影の部分がで...

Tomcat での jar のロードに関する異常な問題の分析と解決

現象の説明:プロジェクトでは、Springboot を使用して Web プロジェクトを開始します。起...

jQueryのanimateアニメーションメソッドとアニメーションキューイング問題の解決方法の詳しい説明

目次animate() アニメーションメソッドアニメーションキューイングdelay() メソッドアニ...

MySQL GTID の総合概要

目次01 GTIDの紹介02 GTIDの仕組み03 GTIDの利点と欠点04 テスト環境構築05 テ...

TomcatはLog4jを使用してcatalina.outログを出力します。

Tomcat のデフォルトのログは java.util.logging を使用しますが、これにはい...

Vue の計算プロパティの詳細な説明

目次補間式方法計算された要約する今日は、Vue の計算プロパティについてお話ししましょう。計算プロパ...

この記事では、CSSの2列レイアウトと3列レイアウトの具体的な使い方をまとめます。

序文大規模なフロントエンドの開発に伴い、UI フレームワークが次々と登場し、フロントエンド開発におけ...

Vue を使用した Amap アプリケーション開発のベスト プラクティス

目次序文非同期読み込みパッケージコンポーネントコンポーネントの使用インターフェースをカスタマイズする...

Zabbix を使用して ogg プロセスを監視する (Windows プラットフォーム)

この記事では、Windows プラットフォームで ogg プログラムを監視する方法を紹介します。 (...

Docker がポート 2375 を公開し、サーバー攻撃を引き起こす問題と解決策

docker リモート API を学習した学生であれば、ポート 2375 についてよくご存知だと思い...

divは、自動入力スタイルをブロックする入力ボックスとして入力を使用せずにコンテンツを入力できます。

今日、私は公開用の動的なウィンドウ スタイルを設計しましたが、マウスで入力をクリックしたときにブラウ...

Unicode署名BOMによる事故原因の分析

ここでは、通常ヘッダーとフッターに対して行われるインクルード ファイルを使用している可能性があります...

Mysql テーブルコメントフィールド取得操作

余計なことは言わないで、コードだけ見てみましょう〜 -- テーブル内のフィールドコメントを表示および...