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 ツリー構造テーブルの設計と最適化に関する簡単な説明

推薦する

MySQLのクラスタモードでのgalera-clusterのデプロイメントの詳細説明

目次1: galera-clusterの紹介2. galera-clusterの仕組み3: Mari...

ccs3に基づくタイムライン実装方法

Web プロジェクトでは、タイムライン コントロールをよく使用します。この記事では、項目ごとに展開で...

VMware Workstation に Windows Server 2019 をインストールする (グラフィック チュートリアル)

キーの入力を求められた場合は、[キーがありません]を選択します。デスクトップエクスペリエンスを選択す...

nginx proxy_cache バッチキャッシュクリアスクリプトの紹介

前書き: 以前、公式の nginx proxy_cache を CDN 静的キャッシュとして使用して...

LeetCode の SQL 実装 (196. 重複するメールボックスを削除する)

[LeetCode] 196.重複したメールを削除するSQL クエリを記述して、Person とい...

Linux centos7 に phpMyAdmin をインストールするチュートリアル

yum install httpd php mariadb-server –yランプの動作環境を設定...

Docker 構成 Alibaba Cloud イメージアクセラレーション プル実装

今日はdockerを使ってイメージをpullしたのですが、速度が悪くて見れず最後まで待ち続けました。...

eCharts でパーセンテージ付きの横棒グラフを実装する方法

目次サンプルコードレンダリングコード分​​析要約するサンプルコード var データ = [220, ...

CentOS 7.3 で Nginx 仮想ホストを設定する方法

実験環境最小限にインストールされた CentOS 7.3 仮想マシン基本環境を構成する1. ngin...

Vue 仮想リストの実例

目次序文デザイン成し遂げるまとめ序文最近は、いつも延々とスワイプしています。 Weibo をチェック...

ElementUI el-select の過剰なデータに対する解決策についての簡単な説明

目次1. シナリオの説明2. 解決策オプションが多すぎる el-select コンポーネントの解決策...

MYSQL における char と varchar の違い

CHAR 型と VARCHAR 型は似ていますが、主に格納場所、末尾のスペース、取得方法が異なります...

VMware 仮想マシンに固定 IP アドレスを設定する方法 (グラフィック チュートリアル)

1. メニューバーで「編集」→「仮想ネットワーク エディター」を選択して仮想ネットワーク エディタ...

10秒以内にMySQLデータベースに数百万件のレコードを挿入する実装

まず、次の質問について考えてみましょう。このような膨大な量のデータをデータベースに挿入するには、通常...

Mysql の 2 つのテーブル間の結合クエリの 4 つの状況の概要

一般的に言えば、より完全な結果を得るためには、2 つ以上のテーブルから結果を取得する必要があります。...