Laravel и загрузка изображения более 2 МБ

#laravel #vue.js #file-upload

#laravel #vue.js #загрузка файла

Вопрос:

Я безуспешно пытаюсь загрузить PDF-файлы размером более 2 МБ. Изменены настройки php.ini, время ожидания сервера, но все равно ошибка.

Давайте посмотрим на некоторый код:

Это функция на контроллере

  public function saveImage(Request $request)
    {
        // return $request->all();
        $consorciado = User::where('cpfCnpj', '=', $request->consorciado_id)->first();
        $documento = Documento::where('cad_doc_id', '=', $request->id)->first();
        $documento = new Documento();
        $image = request()->file('f');
        $documento->user_id = $consorciado->id;
        $documento->cad_doc_id = $request->id;
        $documento->remark = $request->remark;
        $documento->idTematica = $request->idTematica;
        $documento->field1 = $request->field1;
        $documento->field2 = $request->field2;
        $documento->field3 = $request->field3;
        $documento->field4 = $request->field4;
        $documento->field5 = $request->field5;
        $filename =  $request->field1 . "_" . $request->field2 . "_" . $request->field3 . "." . $image->getClientOriginalExtension();
        $documento->nome = $filename;

        Storage::disk('local')->put('public/' . $filename, file_get_contents($image), 'public');
        $documento->save(); //salva no meu banco


        $client = new Client([
            'base_uri' => 'https://gedms.gedocflex.com.br/api/file',
        ]);
        $response = $client->request('POST', 'https://gedms.gedocflex.com.br/api/file', [
            'multipart' => [
                [
                    'name' => 'idTematica',
                    'contents' => $request->idTematica
                ],
                [
                    'name' => 'f',
                    'contents' =>  fopen(storage_path() . "/app/public/" . $filename, 'r')
                    // 'contents' =>  fopen('http://18.191.51.177/storage/' . $filename, 'r')
                ],
                [
                    'name' => 'field1',
                    'contents' => $request->field1
                ],
                [
                    'name' => 'field2',
                    'contents' =>  $request->field2
                ],
                [
                    'name' => 'field3',
                    'contents' => $request->field3
                ],
                [
                    'name' => 'field4',
                    'contents' => $request->field4
                ],
                [
                    'name' => 'field5',
                    'contents' => $request->field5
                ],
                [
                    'name' => 'remark',
                    'contents' =>  'CARTA'
                ],
            ]
        ]);

        return $response;
    }
  

Форма загрузки является компонентом VueJS, а код:

 <template>
  <div class="form-group col">
    <label class="custom-file">
      <slot></slot>
      <input
        type="file"
        name="f"
        class
        @change="GetImage"
        accept="image/jpeg, image/gif, image/png, application/pdf"
        :required="required"
      />
      <img :src="avatar" alt="Imagem" class="drop" />
      <a
        href="#"
        v-if="loaded"
        @click="ligaSpinner"
        class="btn btn-success m-t-10"
        @click.prevent="Upload"
      >
        <div v-if="spinner" class="spinner-grow spinner-grow-sm" role="status">
          <span class="sr-only">enviando...</span>
        </div>Enviar
      </a>
      <a href="#" v-if="loaded" class="btn btn-danger m-t-10" @click.prevent="Cancel">Cancelar</a>
    </label>
    <span class="custom-file-control text-muted"></span>
  </div>
</template>
<script>
export default {
  props: [
    "consorciado_id",
    "id",
    "name",
    "remark",
    "idTematica",
    "field1",
    "field2",
    "field3",
    "field4",
    "field5",
    "required"
  ],
  data() {
    return {
      avatar: "http://18.191.51.177/imagens/doc_original.png",
      loaded: false,
      consorciado: this.consorciado_id,
      spinner: false,
      reload: null
    };
  },
  methods: {
    ligaSpinner() {
      this.spinner = true;
    },
    GetImage(e) {
      let f = e.target.files[0];
      this.Read(f);
      let id = this.consorciado;
      let doc_id = this.id;
      let remark = this.remark;
      let idTematica = this.idTematica;
      let field1 = this.field1;
      let field2 = this.field2;
      let field3 = this.field3;
      let field4 = this.field4;
      let field5 = this.field5;
      let form = new FormData();
      form.append("f", f);
      form.append("consorciado_id", id);
      //   form.append("tipo", tipo);
      form.append("id", doc_id);
      form.append("remark", remark);
      form.append("idTematica", idTematica);
      form.append("field1", field1);
      form.append("field2", field2);
      form.append("field3", field3);
      form.append("field4", field4);
      form.append("field5", field5);
      this.file = form;
    },
    Upload() {
      axios
        .post(
          "/saveImage",
          this.file,
          //   this.tipo,
          this.doc_id,
          this.remark,
          this.idTematica,
          this.field1,
          this.field2,
          this.field3,
          this.field4,
          this.field5
        )
        .then(res => {
          this.reload = true
          this.$toasted
            .show("Documento enviado com sucesso!", {
              type: "success"
            })
            .goAway(3000);
          this.loaded = false;
          this.ligaSpinner = false;
        });
    },
    Read(f) {
      let reader = new FileReader();
      reader.readAsDataURL(f);
      reader.onload = e => {
        this.avatar = "http://18.191.51.177/imagens/doc_pdf.png";
      };
      this.loaded = true;
    },
    Cancel() {
      (this.avatar = "http://18.191.51.177/imagens/doc_original.png"),
        (this.loaded = false);
    }
  }
};
</script>
  

Ошибка:
message: "file_get_contents(): Filename cannot be empty"

Это происходит только при попытке загрузить файл размером более 2 МБ

Не могу понять, почему нельзя загружать файлы большего размера. PS: Я могу загрузить большой файл через Postman. Проблема возникает при попытке загрузки через браузер.

Что я делаю не так? Заранее спасибо

Комментарии:

1. все еще ошибка — какая ошибка?

Ответ №1:

Ну, проблема была в php.ini при настройке максимального размера загружаемого файла. Просто изменил на большее число, и теперь оно работает!

В любом случае спасибо!