fileReader 使用時の落とし穴と解決策

fileReader 使用時の落とし穴と解決策

fileReader に関する落とし穴

画像閲覧にfileReaderを使用する場合、

base64形式を使用する

var ファイル = this.$refs.resource.files[0]
var リーダー = 新しい FileReader();
// ファイルを DataURL として読み取ります:
reader.readAsDataURL(ファイル);
// 読み取り後のコールバック js はマルチスレッドです reader.onloadend=(e)=>{
}

Javascript 自体はシングルスレッドであり、非同期機能はありません。 Javascript はブラウザで使用され、ブラウザ自体が典型的な GUI ワーカー スレッドであるため、ほとんどのシステムでは、相互作用のブロックを回避するために GUI ワーカー スレッドがイベント処理として実装され、Javascript の非同期性が生まれます。その後に起こったことはすべてここから始まったのです。

そうです、ネットワーク、ファイル。 。 。 。すべてブラウザインターフェースに基づいて実装されています

同じファイルを2回読み込んだ場合、読み込み完了イベントは実行されません。

iOS における FileReader の落とし穴 (イメージを base64 に変換)

最近、あるプロジェクトに取り組んでいます。写真をアップロードするのは非常に古い機能です。次に、写真を圧縮してbase64に直接アップロードしたいのですが...最初に使用したコード

var fileUpload = function(obj, コールバック){
            //ブラウザがFileReaderオブジェクトをサポートしているかどうかを確認します。if (typeof FileReader == "undefined") {
                alert("お使いのブラウザはFileReaderオブジェクトをサポートしていません!");
            }
            var ファイル = obj;
            //タイプが画像かどうかを判断します if (!/image\/\w+/.test(file.type)){
                alert("ファイルが画像タイプであることを確認してください");
                false を返します。
            }
            var リーダー = 新しい FileReader();
            reader.onload = 関数 (e) {
                var img = 新しい画像、
                    width = 95, //画像のサイズ変更 width quality = 0.2, //画像の品質 canvas = document.createElement('canvas'),
                    引き出し = canvas.getContext("2d");
                結果:
                var scale = parseInt(img.height / img.width);
                幅 = 幅;
                img.height = 幅 * スケール;
                キャンバスの幅 = img の幅;
                キャンバスの高さ = img.height;
                drawer.drawImage(testimgId, 0, 0, canvas.width, canvas.height);
                var base64 = canvas.toDataURL('image/jpeg', 0.2);
                コンソールログ(base64);
                var image_base64 = img.src.replace("data:image/png;base64,","");
                image_base64=encodeURIコンポーネント(image_base64);
                警告("19")
                //コールバックを呼び出す callback&&callback(img.src);
            }
            reader.readAsDataURL(ファイル);
        }

上記のコードは PC と Android では正常に動作しますが、iOS では、アップロードした画像に関係なく、base64 エンコードの固定文字列を返します。

では変更します...

もう一度変更します.....

各種ドキュメントを表示します。

変化し続ける...

これが最終的に解決された方法です

関数 getBase64(fileObj){
            var ファイル = fileObj、
                cvs = document.getElementById("キャンバス"),
                ctx = cvs.getContext("2d");
            if(ファイル){
                var url = window.URL.createObjectURL(file); //PS: IE と互換性がありません
                var img = 新しい画像();
                url = 画像ファイル
                img.onload = 関数(){
                    ctx.clearRect(0,0,cvs.width,cvs.height);
                    cvs.width = img.width;
                    cvs.height = img.height;
                    ctx.drawImage(画像、0、0、画像の幅、画像の高さ);
                    var base64 = cvs.toDataURL("image/png");
                    コールバック(base64);
                    警告("20")
                }
            }
        }

これが共有のポイントです...

その理由は、FileReader オブジェクトが iOS ではサポートされていないためです。

上記は私の個人的な経験です。参考になれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • ファイル、FileReader、Ajax ファイルアップロードの例の分析 (php)
  • jsはFileReaderを使用してローカルファイルまたはBLOBを読み取ります
  • JS を使用してファイルを操作する (FileReader は --node の fs を読み取ります)
  • JS の FileReader を介して .txt ファイルの内容を取得する方法

<<:  CSSのtranslate(-50%,-50%)は水平および垂直の中央揃え効果を実現します。

>>:  MySQL ツリー構造テーブルの設計と最適化に関する簡単な説明

推薦する

Vue ボタンの権限制御の導入

目次1. 手順1. ボタンの権限を定義する2. ストアを定義する3. 権限指示を作成する4. パーミ...

Reactの原理の説明

目次1. setState() の説明1.1 データの更新1.2 推奨構文1.3 2番目のパラメータ...

タグのhref属性とonclickイベントの使用例

a タグは主にページ ジャンプを実装するために使用され、これは href 属性または onclick...

HTTPプロトコルにおけるステータスコードの意味

暫定的な応答を示し、要求者に操作の続行を要求するステータス コード。コードの説明100 (続行) リ...

すべてのブラウザとの完全な互換性を実現するために最適なプリセットを選択してください

各ブラウザの select タグのプロパティと各ブラウザのサポートが多少異なるため、各ブラウザでの選...

MySql 5.7.17 winx64 のインストールと設定に関する詳細なチュートリアル

1. ソフトウェアをダウンロードする1. MySQL の公式サイトにアクセスし、Oracle アカウ...

Linux 7.6 バイナリに MySQL 8.0.27 をインストールする詳細な手順

目次1. 環境整備1.1 オペレーティング システムのバージョン1.2 ディスク容量1.3 ファイア...

CentOSにDockerをインストールする方法

ここでは比較的簡単なインストール方法のみを紹介します。 1. yumを使用してインストールするyum...

フロントエンドJavaScriptは関数のカリー化を完全に理解している

目次1. カレーとは何か2. カレーの用途3. カリー化ユーティリティ関数をカプセル化する方法 1....

Mysqlデータベースの文字化けに対処する方法

MySQL では、データベースの文字化けは一般的に文字セットを設定することで修正できますが、文字化け...

Vueバインディングオブジェクトと配列変数を変更した後にレンダリングできない問題の解決策

プロジェクトシナリオ:ページ表示には <ul> タグがあります。リストデータを動的に表示...

ServerManager の起動時にデータベースに接続できないエラーを解決する方法

Servermanager 起動時の接続データベース エラーmgrstart.batを実行しますエラ...

CSS スタイルが機能しない (史上最も完全な解決策の概要)

ページを作成するときに、記述した CSS スタイルが有効にならないことがあります。この現象にはさまざ...

Vueの監視プロパティの詳細な説明

目次Vue モニターのプロパティリスナープロパティとは何ですか?リスニングプロパティと計算プロパティ...

HTML における <meta> タグの使用に関する詳細な説明

私たちが作成する Web ページでは、より多くの人々に訪問してもらいたい場合、検索エンジンを使用して...