【问题标题】:Store nested data with files with vuejs & laravel使用 vuejs 和 laravel 将嵌套数据存储在文件中
【发布时间】:2019-03-20 05:14:32
【问题描述】:

我有一个包含少数实体信息的表格:公民、护照、护照扫描。

我需要保存公民及其关系,同时上传护照扫描图像。

我最终在客户端有一个如下所示的对象:

但是我不知道如何存储扫描,因为我无法从 laravel 的 $request->file(...) 方法中得到任何东西(它返回 null)。

在我的情况下,所有这些实体都必须是一致的,我的意思是不应该有任何情况下我存储没有护照的公民或没有扫描的护照。

所以我不确定在这种情况下如何存储扫描,因为例如我不能在 formData 对象中使用嵌套数据。

【问题讨论】:

  • Base64 不在请求文件中,您必须读取字符串并将其转换回图像$request->get('foreignCitizen.passports[0].scans[0]')。另一种选择是存储此人,后者使用 FormData 提交护照文件,以便POST /person/1/scans 将文件附加到第 1 个人。
  • 我想过将请求分为 1. 存储人员 2. 存储护照 3. 存储护照扫描,但想知道如果我需要保持这 3 个查询一致,例如,不应该有任何未加载扫描的情况(例如连接已丢失)。不确定我是否让您了解将字符串转换为图像,好吧,我可以获得字符串,但是如何将其转换为图像(或通常转换为任何文件,以便 laravel 可以确定 mime-type 和其他内容)

标签: laravel vue.js file-upload


【解决方案1】:

Base64 不在请求文件中,您必须读取字符串并将其转换回图像$request->get('foreignCitizen.passports[0].scans[0]')。另一种选择是存储人和后者在提交护照文件时使用 FormData 以便 POST /person/1/scans 将文件附加到人员 1。

使用此验证器,您可以验证图像。

    Validator::extend('image64',function($attribute, $base64Data, $mimeTypes, $validator) {
        // strip out data uri scheme information (see RFC 2397)
        if (strpos($base64Data, ';base64') !== false) {
            [$_, $base64Data] = explode(';', $base64Data);
            [$_, $base64Data] = explode(',', $base64Data);
        }

        // strict mode filters for non-base64 alphabet characters
        if (base64_decode($base64Data, true) === false) {
            return false;
        }

        // decoding and then reeconding should not change the data
        if (base64_encode(base64_decode($base64Data)) !== $base64Data) {
            return false;
        }

        $image = base64_decode($base64Data);
        $file  = finfo_open();
        $type  = finfo_buffer($file, $image, FILEINFO_MIME_TYPE);

        return in_array($type, $mimeTypes);
    });

灵感来自Spatie media lib

foreignCitizen.passports.*.scans.*.data => 'required|base64:image/jpeg'。 现在我们有了一个有效的 base64 图像,我们可以安全地存储它。

我喜欢使用Spatie media library 有一个方法addMediaFromBase64()。 您也可以手动转换 base64 字符串并将其存储为文件。

如果您选择拆分流程,请先存储人物,然后再存储图像。这可能更容易实现,并且后端的代码更少。

【讨论】:

    【解决方案2】:

    我昨天遇到了同样的问题,终于找到了解决方案。这里是:

    Laravel 文档没有说或者至少我找不到它,但是你也可以像访问任何其他字段一样访问上传的文件,例如:$reques->uploadedFile 并使用它来像这样存储它

    Storage::putFile('public', $request->uploadedFile);
    

    因此,在您的示例中,您可以像这样存储扫描:

    Storage::putFile('public', $request->foreignCitizen['passports'][0]['scans'][0]);
    

    总的来说,您肯定知道如何应用一些 for 循环以使其更易于管理。

    PS:你没有提到你是否已经解决了将带有嵌套文件的对象发送到 laravel 的部分,但就像我说的那样,我遇到了完全相同的问题(vuejs/laravel),如果你仍然还没解决,我也可以帮忙。

    【讨论】:

      猜你喜欢
      • 2017-07-02
      • 2021-04-22
      • 2021-08-24
      • 2017-02-21
      • 1970-01-01
      • 2021-02-08
      • 2012-03-06
      • 2020-03-29
      • 2016-05-06
      相关资源
      最近更新 更多