【问题标题】:Cannot save multiple Image using Form Data无法使用表单数据保存多个图像
【发布时间】:2021-04-26 15:50:33
【问题描述】:

首先这是我得到的错误。

这是我第一次使用带有其他输入的多个图像。

正如您在我的 FormData Headers 中看到的,图片文件是一个空数组。

但在控制台内部它返回一个文件。

我的问题是这个很好吗?因为我发送的图片是 PNG,但它只显示 FILE。

这是我的 Vue 代码。

 <q-dialog
  v-model="uploadForm"
  transition-show="slide-up"
  transition-hide="slide-down"
  persistent
>
  <q-card style="width: 700px; max-width: 50vw;">
    <q-card-section>
      <div class="text-h6">Add Product</div>
    </q-card-section>
    <div class="q-pa-md">
      <form
        action="http://127.0.0.1:8000/api/createProduct"
        class="q-gutter-md"
        method="POST"
        enctype="multipart/form-data"
      >
        <q-input outlined label="Product name" v-model="data.productName" />

        <q-input
          multiple="multiple"
          outlined
          type="file"
          accept="image/png,jpg/jpeg"
          @change="onFilePicked"
          ref="file"
        >
          <template v-slot:prepend>
            <q-icon name="attach_file" />
          </template>
        </q-input>
        <div>
          <div class="image-category">
            <div v-for="(image, key) in data.picture" :key="key">
              <div class="image-item">
                <img
                  class="grid"
                  :src="image.src"
                  width="300"
                  height="300"
                />
              </div>
            </div>
          </div>
        </div>

        <q-input outlined label="Description" v-model="data.description" />

        <q-input
          prefix="₱ "
          type="number"
          outlined
          label="Price"
          v-model="data.price"
        />

        <q-select
          square
          outlined
          v-model="data.category_id"
          :options="categories"
          :option-value="'id'"
          :option-label="'categoryName'"
          label="Category"
        />

        <div class="q-ma-md float-right">
          <q-btn label="Submit" color="primary" @click="createProduct" />
          <q-btn
            label="Cancel"
            color="primary"
            flat
            class="q-ml-sm"
            @click="closeCreateModal"
          />
        </div>
      </form>
    </div> </q-card
></q-dialog>

我返回的 Data()

  data: {
    picture: [],
    productName: "Grizzly Bear",
    description: "Machaba.",
    price: "260000",
    category_id: []
  },

我的@Change 接受多个图像。

    onFilePicked(e) {
  let selectedFiles = e.target.files;
  for (let i = 0; i < selectedFiles.length; i++) {
    let img = {
      src: URL.createObjectURL(selectedFiles[i]),
      file: selectedFiles[i]
    };
    this.data.picture.push(img);
    console.log(this.data.picture, "inside");
  }
  console.log(this.data.picture, "outside");
},

我的 CreatingProduct 方法。

createProduct() {
  let t = this.data;

  if (
    t.picture == "" ||
    t.productName.trim() == "" ||
    t.description.trim() == "" ||
    t.price == "" ||
    t.categories == ""
  ) {
    this.uploadForm = false;

    this.$q
      .dialog({
        title: "Incomplete Details",
        message: "Please fill up all the fields in the Product",
        persistent: true,
        color: "negative"
      })
      .onOk(() => {
        this.uploadForm = true;
      });
  } else {
    let formData = new FormData();
    const picture = JSON.stringify(this.data.picture); // returns [object, object] so I needed to do 
 //this.
    const category_id = JSON.stringify(this.data.category_id); 

    formData.append("picture", picture);
    formData.append("productName", this.data.productName);
    formData.append("description", this.data.description);
    formData.append("price", this.data.price);
    formData.append("category_id", category_id);

    let config = {
      headers: {
        "Content-Type": "multipart/form-data"
      }
    };

    this.$axios
      .post("http://127.0.0.1:8000/api/createProduct", formData, config)
      .then(response => {
        this.products.unshift(response.data);
        this.uploadForm = false;
        (this.data = ""),
          this.$q.notify({
            icon: "info",
            message: "Product Added Successfully",
            color: "positive"
          });
      })
      .catch(() => {
        this.$q.notify({
          color: "negative",
          position: "top",
          message: "Unable to save Product",
          icon: "report_problem"
        });
      });
  }
}},

我在 laravel 中的后端

    public function createProduct(Request $request)
{
    $this->validate($request,[
        'productName' => 'required',
        'description' => 'required',
        'picture' => 'required|image|mimes:jpg,png,jpeg|max:2048',
        'price' => 'required',
        'category_id' => 'required'
    ]);

    $product = new Product($request->input());


    if($request->hasFile('picture')){
        foreach($request->file('picture') as $file){
            $name = $file->getClientOriginalName();
            $file->move(public_path().'/uploads/',$name);
            $product->picture = $name;
        }
    }

    $product->save();

    return response()->json($product);

}

谁能向我解释什么是错的?我做了我的研究,它不起作用。以及如何编辑多个图像?您将如何在索引中选择特定图像来进行编辑。

这是我第一次使用 Quasar + Laravel 创建具有多个图像的产品。

【问题讨论】:

    标签: laravel vue.js


    【解决方案1】:

    我认为您做错了一些事情,如果您使用框架,请尝试按照预期使用它,无论是验证还是它们所具有的组件,我都会详细说明一个示例

    new Vue({
        el: '#q-app',
        data: function() {
            return {
                uploadForm: true,
                data: {
                    picture: [],
                    productName: "Grizzly Bear",
                    description: "Machaba.",
                    price: "260000",
                    category_id: null
                },
                categories: [
                    { id: 1, categoryName: 'categoria 1' }
                ]
            }
        },
        methods: {
            createProduct() {
                this.$q.loading.show()
                let formData = new FormData()
    
                formData.append("picture", this.data.picture);
                formData.append("productName", this.data.productName);
                formData.append("description", this.data.description);
                formData.append("price", this.data.price);
                formData.append("category_id", this.data.category_id.id);
    
                axios.post('http://localhost:8000/', formData, {
                    'headers': {
                        'Content-Type': 'multipart/form-data;'
                    }
                }).then((response) => {
                    alert(response)
                }).catch(error => {
                    if (error) {
                        console.log('error', error)
                    }
                }).finally(() => {
                    this.$q.loading.hide()
                })
            },
            closeCreateModal() {
                alert('close')
            },
        }
    })
    <link rel="stylesheet"
          type="text/css"
          href="https://cdn.jsdelivr.net/npm/@quasar/extras/material-icons/material-icons.css">
    <link rel="stylesheet"
          type="text/css"
          href="https://cdn.jsdelivr.net/npm/quasar/dist/quasar.min.css">
    <script src="https://cdn.jsdelivr.net/npm/vue"></script>
    <script src="https://cdn.jsdelivr.net/npm/quasar/dist/quasar.umd.min.js"></script>
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
    
    <div id="q-app">
      <q-dialog v-model="uploadForm"
                transition-show="slide-up"
                transition-hide="slide-down"
                persistent>
        <q-card style="width: 700px; max-width: 50vw;">
          <q-card-section>
            <div class="text-h6">Add Product</div>
          </q-card-section>
          <q-card-section class="q-pt-none">
            <div class="q-pa-md">
              <q-form @submit="createProduct"
                      class="q-gutter-md">
                  <q-input outlined
                           label="Product name"
                           v-model="data.productName"
                           :rules="[val => !!val || 'Field is required']"></q-input>
    
                  <q-file multiple outlined v-model="data.picture" label="Outlined" accept="image/png,jpg/jpeg"
    :rules="[val => !!val || 'Field is required']">
                    <template v-slot:prepend>
                    <q-icon name="attach_file" ></q-icon>
                    </template>
                  </q-file>
                  <q-input outlined
                           label="Description"
                           v-model="data.description"
                           :rules="[val => !!val || 'Field is required']"></q-input>
                  <q-input prefix="₱ "
                           type="number"
                           outlined
                           label="Price"
                           v-model="data.price"
                           :rules="[val => !!val || 'Field is required']"></q-input>
                  <q-select square
                            outlined
                            v-model="data.category_id"
                            :options="categories"
                            option-value="id"
                            option-label="categoryName"
                            label="Category"
                            :rules="[val => !!val || 'Field is required']"
                            ></q-select>
                  <div>
                    <q-btn label="Submit"
                           color="primary"
                           type="submit"></q-btn>
                    <q-btn label="Cancel"
                           @click="closeCreateModal"
                           flat class="q-ml-sm"></q-btn>
                </div>
              </q-form>
            </div>
          </q-card-section>
        </q-card>
      </q-dialog>
    </div>

    如果你看到日志,“图片”属性有一个对象文件数组

    后端处理(laravel)由您自行决定

    我认为如果您分享一个包含问题的链接以供将来参考会更容易

    https://jsfiddle.net/idkc/L8xn0puq/52/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-24
      • 1970-01-01
      • 1970-01-01
      • 2020-06-15
      • 2012-11-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-09
      相关资源
      最近更新 更多