【问题标题】:How to get image from an nested input array Laravel如何从嵌套输入数组 Laravel 中获取图像
【发布时间】:2018-01-18 13:32:43
【问题描述】:

我正在尝试在嵌套数组中获取输入值,如下所示。但问题是图像数组丢失,或者如果没有,我不知道如何获取图像文件的值。

这就是我想要的

 Array
    (
        [_token] => 7iSeeTphiVbpQw3iQ8eb1lReMRzxBY8Lt1lKqQea
        [food] => Array
            (
                [product[1] => Array
                    (
                        [name] => 1
                        [price] => 10
                        [image]=>Uploaded image here
                    )
            )

    )

但我真正得到的是这个

Array
(
    [_token] => 7iSeeTphiVbpQw3iQ8eb1lReMRzxBY8Lt1lKqQea
    [food] => Array
        (
            [product[1] => Array
                (
                    [name] => 1
                    [price] => 10
                )

            [product[2] => Array
                (
                    [name] => 1
                    [price] => 10
                )

        )

)

而我的表单刀片是这样的

 <form method="POST" action="" enctype="multipart/form-data">
   {{csrf_field()}}
  <!-----PHP LOOP STARTS HERE ---->
<select class="form-control" name="food[product[$i][name]]">                                                    
  <option value="1">Fried rice</option>
  <option value="2">Demo food</option>
</select>
<input type="text" placeholder="set a price" class="form-control" name="food[product[$i][price]]">
<input type="file" placeholder="set a price" class="form-control" name="food[product[$i][image]]">
 <!-----PHP LOOP ENDS HERE ---->
<button type='submit'>Submit</button>

谁能帮助我如何获取图像,以便我可以存储在文件夹中并将 url 保存到数据库?在控制器中

更新 我换了表格

<input type="text" placeholder="set a price" class="form-control" name="product[$i][price]">
    <input type="file" placeholder="set a price" class="form-control" name="product[$i][image]">

作为回应,我得到了

[product] => Array
        (
            [1] => Array
                (
                    [name] => 1
                    [price] => 10
                    [image] => Illuminate\Http\UploadedFile Object
                        (
                            [test:Symfony\Component\HttpFoundation\File\UploadedFile:private] => 
                            [originalName:Symfony\Component\HttpFoundation\File\UploadedFile:private] => dell-inspiron-3567-notebook-original-imaetu5ch98vzge5.jpeg
                            [mimeType:Symfony\Component\HttpFoundation\File\UploadedFile:private] => image/jpeg
                            [size:Symfony\Component\HttpFoundation\File\UploadedFile:private] => 40705
                            [error:Symfony\Component\HttpFoundation\File\UploadedFile:private] => 0
                            [hashName:protected] => 
                            [pathName:SplFileInfo:private] => C:\xampp\tmp\php17B2.tmp
                            [fileName:SplFileInfo:private] => php17B2.tmp
                        )

                )

之后我可以看到图片正在上传。现在如何捕获该图像? 如果我尝试 foreach 循环,则该图像丢失。我得到未定义的图像索引。 那我该怎么办?

【问题讨论】:

  • 控制器在哪里可以显示
  • 现在控制器只是 print_r(Input::all());

标签: php html laravel laravel-5 input


【解决方案1】:

您的表单中似乎没有文件字段。如果我理解正确,您希望用户能够上传图片。您需要将最后一个文本输入的类型更改为文件。

&lt;input type="file" placeholder="set a price" class="form-control" name="food[product[$i][image]]"&gt;

然后你可以在你的 php 中使用 $_FILES 来获取你的图片。

希望这会有所帮助;)

【讨论】:

  • 我不是 Laravel 专家,但请您尝试使用 Input::file 和 Input::hasFile。如此处所述:link。正如您已经使用的那样,使用 Input::all 应该可以工作。我只是好奇文件是否真的被上传了。
  • 是的,我想知道文件是否真的被上传了。由于它是一个嵌套数组,我认为我可以尝试获取图像的方式是通过循环。但在循环中不能使用 File 或 hasFile,如果我尝试做Input::hasFile(); or Input::file(); 它不会返回任何空白
  • 您查看过您的 apache 和 php 错误日志吗?文件上传可能有问题。例如文件太大或类似的东西。
  • 是的,那里什么都没有。顺便说一句,我稍微更改了输入表单,现在我可以在响应中看到正在上传图像。现在剩下的唯一问题是如何捕获该图像
  • 我不确定这是否真的是问题,但文档指出您需要运行命令 Input::file('photo')-&gt;move($destinationPath);Input::file('photo')-&gt;move($destinationPath, $fileName); 将实际文件移动到目录(保存文件)。在您的情况下,我认为它应该是(如果在循环中):Input::file($nameOfArray['product'][$i]['image'])-&gt;move($destinationPath);Input::file($nameOfArray['product'][1]['image'])-&gt;move($destinationPath); 如果不在循环中。 附带说明:实际上数组从索引 1 开始有点奇怪:P
【解决方案2】:

似乎无法以正常方式完成我们获取图像并使用Input::hasFile('image') or Input::file('image'); 验证是否存在 所以我就是这样做的。

for ($i = 1; $i<=count(Input::get('product'));$i++){
            $data['name']=$request->product[$i]['name'];
            if (isset($request->product[$i]['price']) && !empty($request->product[$i]['price']) && isset($request->product[$i]['image'])){
                $data['price']=$request->product[$i]['price'];

                //upload image
                $name= substr(md5(str_random(10)), 0, 8);
                $imageName = $name.'.'.$request->product[$i]['image']->getClientOriginalExtension();;
                $request->product[$i]['image']->move(public_path('images/food/'), $imageName);
                $data['image']= 'images/product/'.$imageName;
               if (Product::create($data)){
                   $msg ='All product has been successfully uploaded';
               }
            }else{
                $msg ='Opps!! Something went wrong.';
            }
        }

不知道有没有更好的办法。如果是这样,请告诉我。

感谢@qvotaxon 帮助我,再次感谢大家:))

【讨论】:

    猜你喜欢
    • 2018-03-24
    • 2021-05-31
    • 1970-01-01
    • 2023-01-28
    • 2022-11-20
    • 2016-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多