アップロードファイル(A)

<テンプレート> 
  の<div @クリック= "GET"> 
    <DIV CLASS = "VUE-アップローダー"> 
      <DIV CLASS = "ファイルリスト"> 
        <セクションV- のため = "ファイルの(ファイル、インデックス)"クラス=」ファイル項目ドラッグ項目」:キー= "インデックス"> 
          <IMG:SRC = "file.srcは" ALT = "" ondragstart = "falseを返します;"> 
          <Pクラス= "ファイル名"> {{ファイル。名}} </ P> 
          <スパンクラス= "ファイル削除"をクリックし@ = "(インデックス)を削除"> + </ span>を
        </ section>の
        <セクションV- の場合 = "状態=== '準備'"クラス=「ファイル・アイテム」> 
          <DIV @クラスは= "追加" = "追加"をクリック> 
            の<span> + </ span>を
          </ div> 
        </ section>の
      </ div> 

      <セクションV-もし = "!files.length == 0"クラス= "アップロード-FUNCを"> 
        <divのクラスには、= "プログレスバー"> 
          <セクションV- の場合 = "アップロード":幅= "(パーセント* 100)+「% 「 "> {{(パーセント* 100)+ '%'}} </セクション> 
        </ div> 
        <DIV CLASS ="オペレーションボックス"> 
          <ボタンV- もし「 '="ステータス==='準備@クリック= "提出">上传</ button>の
          <ボタンV- 場合 = "状態=== '終了'" @クリック= "終了">完成</ボタン> 
        </ div> 
      </ section>の
      の<input type = 「ファイル」は「=を受け入れます画像/ *」@変更= "fileChanged" REF = "ファイル"複数= "複数"> 
    </ div> 
  </ div> 
</テンプレート> 

の<script> 
のエクスポートデフォルト{ 
  名: 'Upfile' 
  データ(){ 
    リターン{ 
      状態: '準備' 
      ファイル:[]、
      ポイント:{}、
      アップロード:
      パーセント: 0 
    } 
  }、
  メソッド:{ 
    取得(){ 
      この.GetNumber ()
    }、
    追加(){ 
      この。$ refs.file.click()
    }、
    提出(){ 
      場合この .files.length === 0 ){ 
        console.warn( 'いいえファイル!' のリターン
      } 
      CONST FORMDATA = 新しいいるFormData()
       この .files.forEach((アイテム)=> { 
        formData.append(item.name、item.file)
      })
      CONST XHR = 新規のXMLHttpRequest()
      xhr.upload.addEventListener( '進歩' 、この .uploadProgress、
      xhr.open( 'POST'、 '/ API /アップロード'、この .SRC、この .uploading = 
      xhr.send(FORMDATA)
      xhr.onload =()=> {
         この.uploading = falseの
        場合(xhr.status === 200 || xhr.status === 304 ){
           この .statusは= '終了' 
          はconsole.log( '成功をアップロード!' 
        } { 
          はconsole.log( `エラー:エラーコード$ {xhr.status} `)
        } 
      } 
    }、
    {)(完成
      これは .files = []
       この .status = '準備' 
    }、
    {()のインデックスを削除し
      、この(インデックス.files.spliceを、1 
    } 、
    fileChanged(){ 
      CONSTリスト = この。$ refs.file.files
       (聞かせてI = 0; iのlist.length <;私は++ ){
         場合(!この{.isContain(リスト[i])と)
          constの項目 = { 
            名:リスト[i]が.nameの、
            サイズ:リスト[I] .size、
            ファイル:リスト[I] 
          } 
          この.html5Reader(リスト[i]は、項目)
           この.files.push(アイテム)
        } 
      } 
      この。$ refs.file.value = '' 
    }、
    // 将图片文件转成BASE64格式
    html5Reader(ファイル、項目){ 
      CONSTリーダー = 新しい FileReaderの()
      reader.onload=(E)=> {
         この。$セット(項目、 'SRC' 、e.target.result)
      } 
      reader.readAsDataURL(ファイル)
    }、
    isContain(ファイル){ 
      この .files.forEach((アイテム)=> {
         もし(item.name === file.name && item.size === file.size){
           戻り 
        } 
      })
      を返す 
    } 
    // 上传进度
    uploadprogressの(EVT){ 
      CONST成分 = この
      場合(evt.lengthComputable ){ 
        CONSTはpercentComplete =恐らくMath.round((* 100 evt.loaded)/ evt.total)
        component.percent =はpercentComplete / 100 
      } { 
        console.warn( 'を計算することができない進行をアップロード' 
      } 
    } 
  } 
}
 </ SCRIPT> 

<スタイルスコープ> 
  .vue - アップローダー{ 
    国境:1pxの固体#e5e5e5。
  } 

  .vue -uploader .file- リスト{ 
    パディング:10pxの0PX。
  } 

  .vue -uploader .file- リスト:{後に
    コンテンツ: '' 
    表示ブロック; 
    クリア:両方;
    可視性:隠されました; 
    ライン -height:0; 
    高さ: 0 ; 
    フォント -size:0 ; 
  } 

  .vue -uploader .FILEリスト.file- 項目{
     フロート:左; 
    位置:相対; 
    幅:100ピクセル; 
    テキスト - 揃える:センター; 
  } 

  .vue -uploader .FILEリスト.file- 項目IMG { 
    幅:80px; 
    高さ:80px; 
    国境:1pxの固体#ececec。
  } 

  .vue -uploader .FILEリスト.FILE項目は.file- {削除
    位置:絶対。
    右:12ピクセル;
    表示:なし; 
    トップ:4PX。
    幅:14px;
    高さ:14px; 
    色:白; 
    カーソル:ポインタ;  - 高さ:12ピクセル; 
    ボーダー -radius:100%; 
    変換:回転(45deg)。
    背景:RGBA( 0、0、0、0.5 )。
  } 

  .vue -uploader .FILEリスト.FILE項目:ホバー.file- {削除
    表示:インライン。
  } 

  .vue .file- -uploader .FILEリスト.FILE項目名{ 
    マージン: 0 
    高さ:40ピクセル; 
    単語 - ブレークブレーク - すべて。
    フォント- サイズ:14px;
    オーバーフロー:隠されました; 
    テキスト - オーバーフロー:省略記号。
    表示: -webkit- ボックス。
    -webkitラインクランプ:2 -webkit-ボックス- オリエント:縦; 
  } 

  .vue - アップローダ.add { 
    幅:80px; 
    高さ:80px; 
    マージン - 左:10pxの;
    フロート:左; 
    テキスト - 揃える:センター;  - 高さ:80px; 
    国境:1pxの破線#ececec。
    フォント - サイズ:30px; 
    カーソル:ポインタ; 
  } 

  .vue -uploader .upload-FUNC { 
    ディスプレイ:フレックス。
    パディング:10pxの; 
    マージン:0PX。
    背景:#f8f8f8; 
    国境 - トップ:1pxの固体#ececec。
  } 

  .vue -uploader .upload-FUNC .progress- バー{ 
    フレックス -grow:1 
  } 

  .vue -uploader .upload-FUNC .progress- バーセクション{ 
    マージン - トップ:5pxの。
    背景:#00b4aa。
    国境 - 半径:3px; 
    テキスト - 揃える:センター; 
    色:#FFF; 
    フォント -
  }サイズ:12ピクセル;
    トランジション:すべて.5s容易。

  .vue -uploader .upload-FUNC .operation- ボックス{ 
    フレックス -grow:0 
    パディング - 左:10pxの; 
  } 

  .vue -uploader .upload-FUNC .operation- ボックスボタン{ 
    パディング:12ピクセル4PX。
    色:#FFF; 
    背景:#007ACC。
    国境:なし; 
    国境 - 半径:2ピクセル。
    カーソル:ポインタ; 
  } 

  .vue -uploader>入力[タイプ= "ファイル" ] { 
    表示:なし。
  }
 </スタイル>

 

おすすめ

転載: www.cnblogs.com/ronle/p/10995843.html