Vueはファイルのアップロードとダウンロードを実装します

Vueはファイルのアップロードとダウンロードを実装します

この記事では、参考までにVueのファイルのアップロードとダウンロードの具体的なコードを紹介します。具体的な内容は次のとおりです。

ファイルのアップロード

Vueでのファイルアップロードは、主にフロントエンドでファイルを取得し、バックエンドに送信するという2つのステップに分かれています。

ファイルを取得

フロントエンドは主に入力ボックスを使用してファイルを取得します

<el-dialog :title="addName" :visible.sync="dialogAddFile" width="500px" style="padding:0;" @close="resetAdd">
               添付ファイル名: <el-input v-model="addFileName" autocomplete="off" size="small" style="width: 300px;" ></el-input>
                <div class="add-file-right" style="height:70px;margin-left:100px;margin-top:15px;">
                    <div class="add-file-right-img" style="margin-left:70px;">ファイルをアップロード:</div>
                    <input type="file" ref="clearFile" @change="getFile($event)" multiple="multiplt" class="add-file-right-input" style="margin-left:70px;" accept=".docx,.doc,.pdf">
                    <span class="add-file-right-more">サポートされている拡張子: .doc .docx .pdf </span>
                </div>
                <div class="ファイルリストを追加">
                    <ul>
                        <li v-for="(item, index) in addArr" :key="index"><a >{{item.name}}</a></li>
                    </ul>
                </div>
                <div スロット="フッター" クラス="ダイアログ フッター">
                    <el-button type="primary" @click="submitAddFile" size="small">アップロードを開始</el-button>
                    <el-button @click="resetAdd" size="small">すべて削除</el-button>
               </div>
</el-ダイアログ>

最も重要なのは次のコード行です。

ファイルのアップロードは、ファイル タイプ入力ボックスを通じて実装されます。次に、multiple="multiplt" を設定することで複数のファイルがアップロードされ、accept を使用してアップロード ファイル タイプの制限が実装されます。最後に、change イベントをリッスンすることで、フロント エンドはアップロードされたファイルを取得します。

getFile(イベント){
           var ファイル = event.target.files;
           for(var i = 0;i<file.length;i++){
            // アップロード種別判定 var imgName = file[i].name;
                var idx = imgName.lastIndexOf(".");  
                (idx != -1)の場合{
                    var ext = imgName.substr(idx+1).toUpperCase();   
                    ext = ext.toLowerCase(); 
                     ext!='pdf' && ext!='doc' && ext!='docx' の場合{
                       
                    }それ以外{
                          this.addArr.push(ファイル[i]);
                    }   
                }それ以外{
 
                }
           }
       },

アップロードされたファイルは、変更イベントの event.target.files を通じて取得できますが、取得されるファイルの種類は上記で再度制限されています。

データの提出

ファイル データを取得したら、データをバックグラウンドに送信する必要があります。ここでは、FormData を使用して送信できます。

ファイルの追加を送信します(){
           if(0 == this.addArr.length){
             this.$メッセージ({
               タイプ: '情報'、
               メッセージ: 「アップロードするファイルを選択してください」
             });
             戻る;
           }
 
            var フォームデータ = 新しいフォームデータ();
            フォームデータを追加します。
            フォームデータを追加します。
            formData.append('rfilename',this.addFileName);
            for(var i=0;i<this.addArr.length;i++){
                formData.append('fileUpload',this.addArr[i]);
            }
          設定 = {
            ヘッダー: {
              'コンテンツタイプ': 'multipart/form-data',
              「認証」: this.token
            }
          };
          this.axios.post(apidate.uploadEnclosure、formData、config) は、
            .then((応答) => {
                if(response.data.info=="成功"){this.$message({
                        タイプ: '成功'、
                        メッセージ: '添付ファイルが正常にアップロードされました!'
                    });
                }
            })
        }

データを送信する際には、formData オブジェクトと Content-Type の 2 つの点に注意する必要があります。この 2 つの点を処理すれば、他のインターフェースと同じです。

ファイルをダウンロードする

最初のステップは、サーバーからファイルのリストを取得して表示することです。

<div class="ファイルについて">
    <div class="about-file-title">関連資料</div>
    <ul>
        <li v-for="(item, index) in tenEnclosure.rows" :key="index">
              <a target="_self" >{{item.tenPencSourname}}</a>
              <span @click="toxiazai(index,4,item.tenureId)" title="ダウンロード"></span>
              <span @click="toshanchu(index,4,item.tenureId)" title="削除"></span>
       </li>
   </ul>
</div>

次に、クリック ダウンロード イベントを完了します。

toxiazai(インデックス,数値,ID){
          var tempForm = document.createElement("form"); //フォームを作成し、フォームのさまざまなパラメータに従います tempForm.id = "tempForm1";
          tempForm.method = "post";
          tempForm.action = apidate.downloadEnclosure;
          tempForm.target="_";
          var hideInput1 = document.createElement("入力");
          入力1を非表示にします。属性を設定します('type','hidden');
          入力1を非表示にします。属性を設定します('名前','linkId');
          入力1を非表示にします。属性を設定します('id','linkId');
          入力1を非表示にします。属性を設定します('値'、id);
          tempForm.appendChild(入力1を非表示);
 
          var hideInput2 = document.createElement("入力");
          入力属性を非表示にします。
          入力2を非表示にします。属性を設定します('名前','数値');
          入力2を非表示にします。属性を設定します('id','num');
          入力2を非表示にします。属性を設定します('値',数値);
          tempForm.appendChild(入力2を非表示);
 
 
          if(ドキュメント.all){
            tempForm.attachEvent("onsubmit",function(){}); //IE
          }それ以外{
            var subObj = tempForm.addEventListener("submit",function(){},false); //Firefox
          }
          document.body.appendChild(tempForm);
          if(ドキュメント.all){
            tempForm.fireEvent("onsubmit");
          }それ以外{
            tempForm.dispatchEvent(新しいイベント("送信"));
          }
          tempForm.submit();//POST リクエストを送信document.body.removeChild(tempForm);
},

ファイルをオンラインで開く

PC側では多くのファイルがダウンロードされますが、携帯電話側ではほとんどのファイルがオンラインで直接開かれます。ファイルをオンラインで開きたい場合は、aタグのhref属性を使用して

<ul>
     <li v-for="(item,index) in noticeList" v-bind:key="index" class="person-list" @click="notice(index)">
          <div class="人リスト名">
              <a v-bind:href="[filePrefix+item.uuid_name]" rel="external nofollow" rel="external nofollow" >{{item.file_name}}</a>
         </div>
         <div class="person-list-time">アップロード時間: {{item.create_time}}</div>
     </li>
</ul>

このメソッドを使用してファイルを開く場合は完全なパス名が必要ですが、バックグラウンドからリストを取得する場合は通常相対パスであるため、パスの結合が必要です: v-bind:href="[filePrefix+item.uuid_name]"

画像のアップロードとプレビュー

ファイルをアップロードすると、表示用のファイル名を取得できます。ただし、この方法で写真をアップロードすると、表示は写真名ではなく、写真の表示になってしまいます。

例えば、上記の効果を実現するには、入力を使用して画像をアップロードします

<div class="list-img">
                <ul>
                    <li v-for="(item,index) in imgArr" :key="index">
                        <img :src="item.path" alt="" >
                        <a @click="todel(インデックス)"></a>
                    </li>
           <li>
            <div class="addImg" v-if="imgArr.length<3">
                  <span class="add">写真をアップロード</span>
                  <span class="add">(写真を3枚までアップロードしてください)</span>
                  <input type="file" @change="getFile($event)" accept=".jpg,.png,.bmp,.gif">
             </div>
         </li>
     </ul>
</div>
getFile(イベント){
            var ファイル = event.target.files;
            for(var i = 0;i<file.length;i++){
               // アップロード種別判定 var imgName = file[i].name;
                var idx = imgName.lastIndexOf(".");  
                (idx != -1)の場合{
                    var ext = imgName.substr(idx+1).toUpperCase();   
                    ext = ext.toLowerCase(); 
                    ext!='jpg' && ext!='png' && ext!='bmp' && ext!='gif' の場合{
                        
                    }それ以外{
                            this.imgArr.push(ファイル[i]);
                    }   
                }それ以外{
 
                }
            }
        },

イベント オブジェクトを印刷すると、アップロードされた画像にデバイス上の画像のアドレスに対応するパス フィールドが含まれていることがわかりました。このように画像を表示できることを当然のことと考えていました。その結果、明らかにエラーが発生しました。インターネットで調べたところ、入力を使用してアップロードされた画像を表示するには、FileReader を使用する必要があることがわかりました。

具体的には、入力によって得られた画像をすぐに表示することはできません。両者は全く異なるものなので、表示された画像を格納するための配列が必要になります。

getFile(イベント){
            var ファイル = event.target.files;
            that = this とする;
            for(var i = 0;i<file.length;i++){
               // アップロード種別判定 var imgName = file[i].name;
                var idx = imgName.lastIndexOf(".");  
                (idx != -1)の場合{
                    var ext = imgName.substr(idx+1).toUpperCase();   
                    ext = ext.toLowerCase(); 
                    ext!='jpg' && ext!='png' && ext!='bmp' && ext!='gif' の場合{
                        
                    }それ以外{
                            that.imgArr.push(ファイル[i]);
                    }   
                }それ以外{
 
                }
                //アップロードされた写真を表示する let reader = new FileReader()
                reader.readAsDataURL(ファイル[i])
                reader.onload = 関数(e) {
                    that.imgShow.push(this.result);
                }
            }
        },

このように、データを送信するときにはimgArrが使用され、表示するときにはimgShowが使用されます

もう一つ注目すべき点は、削除操作もあるということです。ここでの削除操作は、インターフェース上では見えないだけでなく、削除された写真をバックグラウンドに渡す必要がないことも意味します。したがって、両方の配列を削除する必要があります。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • ファイルのアップロードとダウンロードを実現する Springboot+vue
  • Vue Excel アップロード プレビューとテーブル コンテンツを Excel ファイルへダウンロード
  • Springboot はファイルのアップロードとダウンロードに vue を統合します
  • Vueはファイルのアップロード、読み取り、ダウンロード機能を実装します
  • Vue で Excel ファイルのアップロードとダウンロード機能を実装する 2 つの方法
  • vue-cli+axios はファイルのアップロードとダウンロード機能を実現します (ダウンロード受信バックグラウンドはファイルストリームを返します)
  • Vueはファイルのアップロードとダウンロード機能を実装します

<<:  SQL インジェクション脆弱性プロセスの例と解決策

>>:  docker ストレージを使用して Exit を実行すると、サーバーへのファイルのアップロードが失敗する問題と解決策

推薦する

フロートをクリアするための CSS メソッドの概要

フロートはWebページのレイアウトでよく使用されますが、フローティングブロックレベル要素は標準のドキ...

Dockerでnginxを実行し、ローカルディレクトリをイメージにマウントする方法

1 hupからイメージを取得する docker プル nginx 2 マウントするディレクトリを作成...

MySQLデータベースでコマンドを自動補完する3つの方法

注意: 3 番目の方法は XSell でのみ使用され、finalsell では使用できません。方法1...

時間別にグループ化された MySQL クエリ ステートメント

年、月、週、日グループによる MySQL クエリ1. 学年別検索 SELECT DATE_FORMA...

Zabbix を使用して Oracle データベースを監視する方法の詳細な説明

1. 概要Zabbix は非常に強力で、最も広く使用されているオープンソースの監視ソフトウェアです。...

CSSの固定位置属性の詳細な説明

モバイル アプリを開発する場合、Web サイトが特定の高さまでスクロールしたときにコンテンツの一部を...

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

目次MySQL 切り捨ての使用1. 構文を切り捨てる2. Truncateの使用上の注意3. TRU...

CentOS 6.5 の設定 ssh キーフリーログインで pssh コマンドを実行する方法の説明

1. psshを確認してインストールします。yum list pssh 2. キーレスログインが設定...

Linux の 5 ステップ ビルド カーネル ツリー

目次0. システムに付属するカーネルツリー1. 環境設定最初のステップステップ2 2. ソースコード...

シェルスクリプトを使用したMySQLデータベースの自動バックアップ

シェルスクリプトを使用したMySQLデータベースの自動バックアップデータベースを頻繁にバックアップす...

MySQL データベースのインデックスとトランザクション

目次1. 索引1.1 コンセプト1.2 機能1.3 索引作成の原則1.3.1 ディスクアクセス回数を...

CentOS 7 でソースコードから Openssh をインストールする方法

環境: CentOS 7.1.1503 最小インストール依存パッケージをダウンロードします: yum...

CSS3 rgb と rgba (透明色) の使い方の詳しい説明

誰もが色にとても敏感だと思います。私たちの目が見るところにはどこにでも色があります。では、CSS で...

Mysql5.7 のルートパスワードを忘れた場合の対処法 (シンプルで効果的な方法)

前回の記事では、MySQL 5.7でルートパスワードを忘れた場合と、MySQL 5.7でルートパスワ...