【问题标题】:laravel: image not being submitted with formlaravel:图像未与表单一起提交
【发布时间】:2017-10-08 03:19:18
【问题描述】:

我在一个页面中有这个表单:

<div class="card-block">
{!! Form::open(array( 'autocomplete' => 'off', 'id' => 'AddModel', 'url' => 'model/useradd', 'files' => true)) !!}
<div class="form-group">
    <label for="picture">Picture</label>
    @if( (new Jenssegers\Agent\Agent)->isMobile() )
    {!! Form::file('image', ['id' => 'modelpic', 'accept' => 'image/*', 'capture' => 'camera'])  !!}
    @else
    {!! Form::file('image', ['id' => 'modelpic']) !!}
    @endif
    <br/>
</div>
<div id="imagePreview" style="display: none;"></div> /** here I show preview of the image through JS */
<div class="form-group">
    {!! Form::submit('Submit', array('id' => 'AddBtn', 'class' => 'btn btn-default' )) !!}
    {!! Form::close() !!}
</div>

在我的控制器中:

public function preview(Request $request)
{
dd($request->file('image'));
}

倾销结果=NULL

我不明白这里有什么问题。我在另一个正常工作的页面中有一个相同的表单。

通过验证请求,我收到错误“需要图像”

$this->validate($request, [

'image' => 'required|mimes:jpeg,jpg,png,gif|image|image_size:>=640'
]);

新信息:

javascript一定有问题,因为删除它控制器可以正常工作:

这是JS

jQuery(function ($) {
    $(document).ready(function () {

        $("body").on("submit", "#AddModel", function (e) {

            var form = $(this);

            $.ajax({
                url: form.prop('action'),
                type: 'post',
                dataType: 'json',
                data: $(this).serialize(),
                success: function (data) {

                console.log(data);


                },
                error: function (textStatus) {

                    {


                        var json = JSON.parse(textStatus.responseText);


                        console.log (json);


                    }

                }
            });
            e.preventDefault();
        });
    });
});

已解决,谢谢@sagar

jQuery(function ($) {
    $(document).ready(function () {

        $("body").on("submit", "#AddModel", function (e) {

            var form = $(this);

            var postData = new FormData($("#AddModel")[0]);

            $.ajax({
                type:'POST',
                url:form.prop('action'),
                processData: false,
                contentType: false,
                data : postData,
                success:function(data){

                    console.log(data);

                },

                error: function (textStatus) {

                    {


                        var json = JSON.parse(textStatus.responseText);


                        console.log (json);


                    }

                }
            });
            e.preventDefault();
        });
    });
});

【问题讨论】:

  • 试试改成dd($request-&gt;file('modelpic'));
  • 也在验证使用modelpic
  • modelpic 是这里的 div 的 ID &lt;input id="modelpic" name="image" type="file"&gt; .. 无论如何,名称是“image”,根据您的建议,modyfing 没有任何变化
  • 删除 files => true 并告诉我们它是否出现使用 $request->input('file')
  • 当您尝试进行预览而不是存储时的问题。不是吗?

标签: php forms image laravel submit


【解决方案1】:

使用 ajax 上传图片:

这样做:

您可以像这样使用 ajax 上传文件。

在您的表单标签中使用属性 enctype 和表单 html 将如下所示:

 <form enctype="multipart/form-data" id="modal_form_id"  method="POST" >
    <input type="file" name="documents">
 </form>

js代码:

           var postData = new FormData($("#modal_form_id")[0]);

                 $.ajax({
                         type:'POST',
                         url:'your-post-url',
                         processData: false,
                         contentType: false,
                         data : postData,
                         success:function(data){
                           console.log("File Uploaded");
                         }

                      });

在您的控制器端,您可以使用如下功能上传图片。

if(Input::hasFile('documents')) {

    $path = "directory where you wish to upload file";

    $file_name= Input::file('documents');   
    $original_file_name = $file_name->getClientOriginalName();

    $extension       = $file_name->getClientOriginalExtension();
    $fileWithoutExt  = str_replace(".","",basename($original_file_name, $extension));  
    $updated_fileName = $fileWithoutExt."_".rand(0,99).".".$extension; 

    $uploaded = $file_name->move($path, $updated_fileName);

    echo $updated_fileName;

}

更多细节:

File upload through a modal using Ajax

【讨论】:

  • 我会尝试,但我没有使用模式,表单在页面中。我想要做的是获取提交的数据,然后显示帖子的预览,以便确认或中止提交。确认存储在数据库中,中止返回表单。
  • 现在我认为这更好,也许我不应该将数据传递给控制器​​进行预览,而是直接传递给 ajax 查询,然后显示带有确认按钮的预览框。
  • @Chriz74 在答案中我以模态形式为例。您可以使用上面的代码发布普通表单数据。您唯一需要更改的是获取表单数据的方式,例如: var postData = new FormData($("#form_id")[0]);它不依赖于模态表单或页面表单
  • 我试过你的代码,它工作正常。我会用我使用的 JS 更新问题。
  • 我不明白的一件事。如果我记录 formData 它似乎是空的,我找不到表单提交的数据,但它正在工作。
【解决方案2】:

此代码检查请求是否有文件,如果是,则对其命名,然后将文件移动到公共目录中的文件夹。

if($request->hasFile('modelpic')) {
        $file = Input::file('modelpic');
       //get file extension
        $name = 'image'.$file->getClientOriginalExtension();
       //move file to public/images dir
        $file->move(public_path().'/images/', $name);
    }

【讨论】:

  • 谢谢,但无论如何文件都应该在请求中,我在使用 imagemagick 修改后以不同的方式存储图像。问题是表单根本没有提交图像。
  • 使用我的if 语句检查请求中是否有文件。在if 中包含回声
  • @Chriz74 你能用名称字段(图像)而不是 id(模型图片)再次检查代码吗?
  • 已经完成了,什么都没有。这是 $request->all(); 的结果array:1 [ "_token" =&gt; "YNDRn9VDR5W3nv6A4P8W7WeUWun77fnvjDZYq3bE" ] .. 这对我来说毫无意义
  • 将文本框字段添加到表单并检查它是否出现在 $request->all()
【解决方案3】:

由于在表单标签中使用了尺寸 (Multipart-form-data),图像与多部分请求一起提交。 像这样,

<div class="card-block">
  {!! Form::open(array( 'autocomplete' => 'off', 'id' => 'AddModel', 'url' => 'model/useradd', 'files' => true,'enctype' => 'multipart/form-data')) !!}
<div class="form-group">
  <label for="picture">Picture</label>
  @if( (new Jenssegers\Agent\Agent)->isMobile() )
   {!! Form::file('image', ['id' => 'modelpic', 'accept' => 'image/*', 'capture' => 'camera'])  !!}
  @else
   {!! Form::file('image', ['id' => 'modelpic']) !!}
  @endif
<br/>
</div>
<div id="imagePreview" style="display: none;"></div> /** here I show preview of the image through JS */
<div class="form-group">
  {!! Form::submit('Submit', array('id' => 'AddBtn', 'class' => 'btn btn-default' )) !!}
   {!! Form::close() !!}
</div>

【讨论】:

  • 我相信'files' =&gt; true 加上enctype="multipart/form-data"
  • 那么你可以使用if ($request-&gt;hasFile('photo')) { //code here }
  • multipart/form-data 已经存在,该表单转换为&lt;form method="POST" action="http://project.dev/model/useradd" accept-charset="UTF-8" autocomplete="off" id="AddModel" enctype="multipart/form-data"&gt;
  • 虽然令人难以置信,但按照您的建议指定它可以神奇地工作!但是看看有没有那个规范的源代码没有任何变化!
  • 你应该在 php.ini 文件中检查你的 post-max-size 和 upload-max-size
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-07
  • 2018-04-09
  • 2018-05-10
  • 1970-01-01
  • 2021-08-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多