【问题标题】:"Call to a member function store() on array" When Uploading a File using Laravel 8 with Jetstream - Vue & Intertia.js“调用数组上的成员函数 store()”当使用 Laravel 8 和 Jetstream 上传文件时 - Vue & Intertia.js
【发布时间】:2020-12-11 18:11:29
【问题描述】:

我在从 vue 文件中的表单上传图像时遇到问题。我尝试了几种方法来做到这一点,但似乎文件设置不正确。

  • 我在表单标签中设置了“enctype="multipart/form-data"

  • 这是我的输入元素:

  • 这是我的数据对象和发送数据的方法:

      data() {
          return {
        editMode: false,
        professionaldevelopmentitems: [],
        professionaldevelopmentitem: {
          domain: 1,
          domaincategory: 1,
          title: "",
          dateofpd: "",
          location: "",
          lengthofpd: "",
          facilitatorname: "",
          facilitatorcredentials: "",
          reflection: "",
          file: "",
        },
      };
    },
    methods: {
      onFileChange(e) {
        alert(e.target.files[0]);
        alert(e.target.files[0].name);
        var files = e.target.files || e.dataTransfer.files;
        if (!files.length)
          return;
        this.professionaldevelopmentitem.file = e.target.files[0];
        alert(this.professionaldevelopmentitem.file);
      },    
      async addProfessionalDevelopmentItem() {
        document.getElementById("pdForm").reset();
        this.editMode = false;
        const res = await axios.post(
          "/api/professionaldevelopmentitems",
          this.professionaldevelopmentitem
        );
    
        if (res.status === 201) {
          Toast.fire({
            icon: "success",
            title: res.data,
          });
          document.getElementById("pdForm").reset();
          $("#manageProfessionalDevelopmentItem").modal("hide");
          Fire.$emit("modifiedPDItem");
        }
      },
      async editProfessionalDevelopmentItem(data) {
        this.professionaldevelopmentitem = Object.assign({}, data);
        this.editMode = true;
      },
      async updateProfessionalDevelopmentItems(data) {
        const res = await axios.put(
          `/api/professionaldevelopmentitems/${data.id}`,
          this.professionaldevelopmentitem
        );
    
        if (res.status === 200) {
          Toast.fire({
            icon: "success",
            title: res.data,
          });
          document.getElementById("pdForm").reset();
          $("#manageProfessionalDevelopmentItem").modal("hide");
          Fire.$emit("modifiedPDItem");
          this.editMode = false;
        }
      },
    

我在控制器中接收数据并尝试存储文件:

公共函数更新(请求$request, $id) {

dd($request->all());

$this->validate($request, [
    'title' => ['required'],
    'dateofpd' => ['required'],
    'lengthofpd' => ['required'],
    'location' => ['required']
]);

$path = $request->file('filename')->store('uploads');

$pditem = ProfessionalDevelopmentItem::find($id);
$pditem->domain = $request->domain;
$pditem->domaincategory = $request->domaincategory;
$pditem->title = $request->title;
$pditem->dateofpd = $request->dateofpd;
$pditem->lengthofpd = $request->lengthofpd;
$pditem->location = $request->location;
$pditem->facilitatorname = $request->facilitatorname;
$pditem->facilitatorcredentials = $request->facilitatorcredentials;
$pditem->certificategranted = $request->certificategranted;
$pditem->certificateexpires = $request->certificateexpires;
$pditem->certificateexpiration = $request->certificateexpiration;
$pditem->reflection = $request->reflection;
$pditem->nameofinstitution = $request->nameofinstitution;
$pditem->coursename = $request->coursename;
$pditem->coursecode = $request->coursecode;
$pditem->hoursofinstruction = $request->hoursofinstruction;
$pditem->creditgranted = $request->creditgranted;
$pditem->bookname = $request->bookname;
$pditem->bookauthor = $request->bookauthor;
$pditem->bookyear = $request->bookyear;
$pditem->bookpublisher = $request->bookpublisher;
$pditem->otherdescription = $request->otherdescription;
$pditem->filename = $path;

$pditem->save();

return response('Successfully Updated the Professional Development Item.', 200);

}

当它尝试存储文件时,返回的响应是一行错误:

"message": "Call to a member function store() on array",
"exception": "Error",

任何关于我做错了什么的想法都将不胜感激。

【问题讨论】:

  • 不应该是$path = $request->file('filename')->store('uploads');
  • 谢谢,我只是补充了一点——它没有任何区别。
  • 尝试使用dd($request->file('filename'));检查$request->file('filename')里面的内容
  • 你运行了错误的dd,要么尝试使用dd($request) 运行整个请求,要么使用$request->file('filename'),同时检查dd($request->hasFile('filename')) 是否返回true 或false
  • 我认为根据您的 Vue 组件代码,该文件应该在“file”键下可用。试试dd($request->hasFile('file'))

标签: php laravel vue.js axios inertiajs


【解决方案1】:

尝试在 FormData 中发送上传的文件。在 Vue 组件中定义一个方法来准备 FormData,其中包含要通过 ajax 发送到服务器的所有数据

prepareFormData() {
    let data = new FormData;

    Object.keys(this.professionaldevelopmentitem).forEach(
        key => data.append(key, this.professionaldevelopmentitem[key]
    );

    return data;
}

然后使用此方法获取FormData,并将其作为数据发送到addProfessionalDeveloomentItemupdataProfessionalDevelopmentItems中的服务器

async addProfessionalDevelopmentItem() {
    document.getElementById("pdForm").reset();
    this.editMode = false;
    const res = await axios.post(
      "/api/professionaldevelopmentitems",
      this.prepareFormData()
    );

    if (res.status === 201) {
      Toast.fire({
        icon: "success",
        title: res.data,
      });
      document.getElementById("pdForm").reset();
      $("#manageProfessionalDevelopmentItem").modal("hide");
      Fire.$emit("modifiedPDItem");
    }
  },
  

  async updateProfessionalDevelopmentItems(data) {
    const res = await axios.put(
      `/api/professionaldevelopmentitems/${data.id}`,
      this.prepareFormData()
    );

    if (res.status === 200) {
      Toast.fire({
        icon: "success",
        title: res.data,
      });
      document.getElementById("pdForm").reset();
      $("#manageProfessionalDevelopmentItem").modal("hide");
      Fire.$emit("modifiedPDItem");
      this.editMode = false;
    }
}

那么你应该在密钥文件$request->file('file')下的$request中获取上传的文件

【讨论】:

    猜你喜欢
    • 2018-11-09
    • 1970-01-01
    • 1970-01-01
    • 2017-07-02
    • 2021-11-15
    • 2021-04-25
    • 2017-04-08
    • 2020-10-14
    • 1970-01-01
    相关资源
    最近更新 更多