2017-08-07 15 views
1

vue.js 2.1とLaravel 5.4を使用して、フォームのないコンポーネントからファイルをアップロードしています。フォームなしでvuejsとlaravelを使用してファイルをアップロードする

問題:サーバー側では、この文return $request->file('my_file');はnullを返します。どうして?

これはVUEのコンポーネントがどのように見えるかです:

public function update(Request $request) 
{ 
    return $request->file('my_file'); 

    // $request->file('my_file')->store(); 
} 

は、私が何をしないのです:

サーバー側で
<template> 
    <input id="my_file" type="file" @change="fileChanged($event)"> 
    <button v-if="my_file" @click="update">Upload</button> 
</template> 

<script> 
export default { 
    data() { 
     return { 
      my_file: null, 
     } 
    }, 

    methods: { 
     fileChanged(e) { 
      var files = e.target.files || e.dataTransfer.files; 
      if (!files.length) 
       return; 
      this.createImage(files[0]); 
     }, 

     createImage(file) { 
      var image = new Image(); 
      var reader = new FileReader(); 
      var vm = this; 

      reader.onload = (e) => { 
       vm.my_file = e.target.result; 
      }; 
      reader.readAsDataURL(file); 
     }, 

     update() { 
      axios.put('/api/update/', { 
       my_file: this.my_file, 
      }) 
      .then(response => { 
       console.log(response.data); 
      }) 
      .catch(error => { 
       console.log(error); 
      }); 
     } 
    } 
} 
</script> 

、私は次のような方法がありますか?だから、私はLaravelによって提供された関数$request->file('my_file')->store();を使ってファイルをアップロードすることができます。

EDIT は、私はそうのようpostputからのHTTP動詞を変更しました:

コントローラで
trySomeThing() { 
    var data = new FormData(); 
    var file = this.$refs.fileInput.files[0]; 
    data.append('attachment_file', file); 
    data.append('msg', 'hello'); 

    axios.post('/api/try', data) 
     .then(response => { 
      console.log(response.data) 
     }); 
}, 

、私が持っている:

public function try(Request $request) 
{ 
    if ($request->hasFile('my_file')) { 
     $file = $request->file('my_file'); 
     //$file->getFilename(); 
     return var_dump($file); 
    } else { 
     return var_dump($_POST); 
    } 
} 

リクエストヘッダが含まれています request

返されたr esponseはこれを示しています

response

+1

使用 '' 'formData''' –

+0

https://medium.com/@jagadeshanh/image-upload-and-validation-using-laravel-and-vuejs-e71e0f094fbb –

答えて

1

まず、あなたのファイル入力にVueの参照を追加します。その後

<input id="my_file" type="file" @change="fileChanged($event)" ref="fileInput"> 

あなたupdate方法更新:詳細情報については

if ($request->hasFile('my_file')) { 
    $file = $request->file('my_file'); 
    dd($file); 
} 

:あなたのlaravelアプリケーションで

update() { 
    var data = new FormData() 
    var file = this.$refs.fileInput.files[0] 
    data.append('my_file', file) 
    axios.put('/api/update/', data)  
    .then(response => { 
     console.log(response.data) 
    }) 
    .catch(error => { 
     console.log(error) 
    }); 
} 

Laravel documentation

+0

をどうやってデータを取得しますサーバー側から?私は 'return $ request-> my_file;'しようとしましたが、nullが返されます。 chrome devToolsでは、送信されたリクエストに以下の内容が含まれていることがわかります。 '------ WebKitFormBoundary9lOFAy36UFyjOmoh コンテンツの処理:form-data; name = "attachment_file";ファイル名= "794a4be39f0b96b4d5787e3e31f8b622.jpg" のContent-Type:画像/ JPEG ------ WebKitFormBoundary9lOFAy36UFyjOmoh' – Warrio

+0

私の編集した答えを参照してください。 – Ikbel

+0

あなたのPHPテストにelseを追加しました。それは 'else'ブロックにあるものを返します。これは '$ request-> hasFile( 'my_file')'が 'false'を返したことを意味します。 – Warrio

0

あなたのビューは、この

ようになるはずですvuejsで
<template> 
<div class="row"> 
    <div class="col-md-12"> 
     <div class="col-md-2"> 
      <img :src="image" class="img-responsive"> 
     </div> 
     <div class="col-md-8"> 
      <input type="file" v-on:change="onFileChange" class="form-control"> 
     </div> 
     <div class="col-md-2"> 
      <button class="btn btn-success btn-block" @click="upload">Upload</button> 
     </div> 
     </div> 
    </div> 
</template> 
<style scoped> 
img{ 
    max-height: 36px; 
} 
</style> 
<script> 
    export default{ 
    data(){ 
     return { 
      image: '' 
     } 
    }, 
    methods: { 
     onFileChange(e) { 
      let files = e.target.files || e.dataTransfer.files; 
      if (!files.length) 
       return; 
      this.createImage(files[0]); 
     }, 
     createImage(file) { 
      let reader = new FileReader(); 
      let vm = this; 
      reader.onload = (e) => { 
       vm.image = e.target.result; 
      }; 
      reader.readAsDataURL(file); 
     }, 
     upload(){ 
      axios.post('/api/upload',{image: this.image}).then(response => { 

      }); 
     } 
    } 
} 
</script> 
+0

はい、彼のために働いたかどうかは、私にとってはうまくいくはずです。新しいプロジェクトを作り、もう一度試してみて、違いを見てみましょう。 – Warrio

+0

@Warrioここではフォームを使用していません。 –

+0

提案したコードで新しいプロジェクトを作成しました。残念ながら、nullを再び返します。 ここにリポジトリ 'git clone [email protected]:warrio4/pr1.git'へのリンクがあります – Warrio

関連する問題