Почему Laravel хранит только последний файл, когда я загружаю несколько файлов одновременно? - PullRequest
0 голосов
/ 27 апреля 2020

Мне нравится загружать несколько файлов одновременно.

Внешний интерфейс Vue / Vuetify:

                                    <v-file-input
                                        v-model="files"
                                        id="files"
                                        ref="files"

                                        multiple
                                        label="Bild oder Datei hinzufügen"
                                        @change="handleFilesUpload"
                                    >

    export default {
        name: "HeaderNotesModal",
        data: () => ({
            media: [],
            files: [],
        }),

        methods: {

            submit () {
                this.$refs.form.validate()
                if (this.valid) {
                    this.store({
                        payload: {
                            title: this.title,
                            body: this.body
                        },
                        context: this
                    }).then(() => {
                        if (this.errors.length === 0) {
                            this.title = ''
                            this.body = ''
                            this.$refs.form.resetValidation()
                            this.form = false
                        }
                        if( this.files.length !== 0 ){
                            this.addMedia({ 'media': this.formData})
                        }
                    })
                }

            },

            handleFilesUpload(e){
                var self = this;
                var files = this.files;
                if(files.length > 0){
                    for(var i = 0; i< files.length; i++){
                        self.formData.append("file[]", files[i], files[i].name);
                    }
                }
            },
        },
        mounted() {
            this.fetchNotes()
        }
    }


export const addMedia = ({ state, commit }, { media}) => {

    return axios.post(`/api/notes/${state.note.id}/media`, media, {
        headers: {
            'Content-Type': 'multipart/form-data'
        }
    })

}

Бэкэнд Laravel:

    public function store(Request $request, Note $note)
    {
        if($request->hasfile('file'))
        {
            foreach($request->file('file') as $file)
            {
                $name = time().'.'.$file->getClientOriginalExtension();
                $file->move(storage_path('uploads'), $name);
                $data[] = $name;
            }
        }
        return 'success';
    }

Когда я загрузить несколько файлов, он хранит только последний файл.

Может кто-нибудь помочь? Я пытался в течение 6 часов все возможные вещи, но я не нашел ошибку.

Я пытался изменить внешний интерфейс, а затем и внутренний.

Я пытался с formData и без.

Я пытался с несколькими именами файлов.

Все без успеха

var_dump return var_dump($request->file('file'));

<code><pre class='xdebug-var-dump' dir='ltr'>
<small>/home/vagrant/code/7aio/app/Http/Controllers/Note/NoteMediaController.php:27:</small>
<b>array</b> <i>(size=2)</i>
  0 <font color='#888a85'>=&gt;</font> 
    <b>object</b>(<i>Illuminate\Http\UploadedFile</i>)[<i>392</i>]
      <i>private</i> 'test' <small>(Symfony\Component\HttpFoundation\File\UploadedFile)</small> <font color='#888a85'>=&gt;</font> <small>boolean</small> <font color='#75507b'>false</font>
      <i>private</i> 'originalName' <small>(Symfony\Component\HttpFoundation\File\UploadedFile)</small> <font color='#888a85'>=&gt;</font> <small>string</small> <font color='#cc0000'>'bgvqm7da.png'</font> <i>(length=12)</i>
      <i>private</i> 'mimeType' <small>(Symfony\Component\HttpFoundation\File\UploadedFile)</small> <font color='#888a85'>=&gt;</font> <small>string</small> <font color='#cc0000'>'image/png'</font> <i>(length=9)</i>
      <i>private</i> 'error' <small>(Symfony\Component\HttpFoundation\File\UploadedFile)</small> <font color='#888a85'>=&gt;</font> <small>int</small> <font color='#4e9a06'>0</font>
      <i>protected</i> 'hashName' <font color='#888a85'>=&gt;</font> <font color='#3465a4'>null</font>
      <i>private</i> 'pathName' <small>(SplFileInfo)</small> <font color='#888a85'>=&gt;</font> <small>string</small> <font color='#cc0000'>'/tmp/phpIIfLwD'</font> <i>(length=14)</i>
      <i>private</i> 'fileName' <small>(SplFileInfo)</small> <font color='#888a85'>=&gt;</font> <small>string</small> <font color='#cc0000'>'phpIIfLwD'</font> <i>(length=9)</i>
  1 <font color='#888a85'>=&gt;</font> 
    <b>object</b>(<i>Illuminate\Http\UploadedFile</i>)[<i>372</i>]
      <i>private</i> 'test' <small>(Symfony\Component\HttpFoundation\File\UploadedFile)</small> <font color='#888a85'>=&gt;</font> <small>boolean</small> <font color='#75507b'>false</font>
      <i>private</i> 'originalName' <small>(Symfony\Component\HttpFoundation\File\UploadedFile)</small> <font color='#888a85'>=&gt;</font> <small>string</small> <font color='#cc0000'>'Screenshot at Apr 27 07-35-08.png'</font> <i>(length=33)</i>
      <i>private</i> 'mimeType' <small>(Symfony\Component\HttpFoundation\File\UploadedFile)</small> <font color='#888a85'>=&gt;</font> <small>string</small> <font color='#cc0000'>'image/png'</font> <i>(length=9)</i>
      <i>private</i> 'error' <small>(Symfony\Component\HttpFoundation\File\UploadedFile)</small> <font color='#888a85'>=&gt;</font> <small>int</small> <font color='#4e9a06'>0</font>
      <i>protected</i> 'hashName' <font color='#888a85'>=&gt;</font> <font color='#3465a4'>null</font>
      <i>private</i> 'pathName' <small>(SplFileInfo)</small> <font color='#888a85'>=&gt;</font> <small>string</small> <font color='#cc0000'>'/tmp/phpdRhiD1'</font> <i>(length=14)</i>
      <i>private</i> 'fileName' <small>(SplFileInfo)</small> <font color='#888a85'>=&gt;</font> <small>string</small> <font color='#cc0000'>'phpdRhiD1'</font> <i>(length=9)</i>

1 Ответ

0 голосов
/ 27 апреля 2020

Согласно do c (https://laravel.com/docs/7.x/filesystem#file -uploads )

метод перемещения может использоваться для переименования или перемещения существующего файла в новое место:

Таким образом, выполнив: $file->move(storage_path('uploads'), $name); он не достигнет того, что вы ищете.

Вместо этого вы можете использовать;


    foreach($request->file('file') as $file)
    {
        $name = time().'.'.$file->getClientOriginalExtension();
        $file->store('uploads');
        $data[] = $name;
    }

...