0

我使用 laravel 6(上次更新),我创建了一个可以上传图片的表单。我在 Windows 操作系统上,我使用 PHPStorm、laravel 和 xampp 应用程序。我所有的配置都设置正确,没有运行问题。

我的问题是,当我从表单提交到达字段时出现此错误:

RuntimeException SplFileInfo::getSize(): stat failed for C:\xampp\tmp\phpA5C6.tmp \

这是我的表单 create.blade.php 中的代码:

@extends('layouts.app')

@section('content')
  <div class="container">


    <div class="row justify-content-center">
      <div class="col-md-8">
        <div class="card">
          <div class="card-header">Creat Post</div>
          <div class="card-body">
            @if(count($errors) > 0)
              <ul>
                @foreach($errors->all() as $error)
                  <li class="alert alert-danger alert-dismissible fade show">
                    <strong>{{$error}}</strong>
                    <button type="button" class="close" data-dismiss="alert" aria-label="Close">
                      <span aria-hidden="true">&times;</span>
                    </button>
                  </li>
                @endforeach
              </ul>
            @endif
            <form action="{{route('post.store')}}" method="POST" enctype="multipart/form-data" >
              @csrf
              <div class="form-group">
                <label for="title">Title</label>
                <input type="text" name="title" class="form-control" id="title" aria-describedby="title" placeholder="Type Your Title">
              </div>
              <div class="form-group">
                <label for="category">Category</label>
                  <select class="form-control" name="category_id" id="category">
                    <option value="0" selected disabled>Select A Category</option>
                    @foreach($categories as $category)
                      <option value="{{$category->id}}">{{$category->name}}</option>
                    @endforeach
                  </select>
              </div>
              <div class="form-group">
                <label for="content">Content</label>
                <textarea class="form-control" name="content" id="content" rows="4" cols="4" placeholder="Type Your Content"></textarea>
              </div>
              <div class="form-group">
                <label for="image">Image</label>
                <input type="file" name="image" id="image" class="form-control-file">
              </div>
              <button type="submit" class="btn btn-primary">Save</button>
            </form>

          </div>
        </div>
      </div>
    </div>
  </div>
@endsection

这是我的控制器的代码:

    public function store(Request $request)
    {
        $data = $this->validate($request, [
                "title"       => "required|string",
                "content"     => "required|string",
                "category_id" => "required",
                "image"       => "required|image"
              ]);

        $file = $request->image;
        $destinationPath = public_path().'/uploads/posts';
        $filename = $destinationPath . '' . time() . '.' . $file->getClientOriginalExtension();
        $uploaded = $file->move($destinationPath,$filename);


        $post = Post::create([
          "title"       => $request->title,
          "content"     => $request->content,
          "category_id" => $request->category_id,
          "image"       => $uploaded
        ]);

上传的文件代码完美运行,我在我想要的选定文件夹中注册文件。我的路线没有问题(无需显示这部分代码)。并且数据库没有计算来自创建帖子的记录。

当我提交表单时,我有这个错误:

RuntimeException SplFileInfo::getSize(): stat failed for C:\xampp\tmp\phpA5C6.tmp

我已经检查了upload_max_filesizeinphp.iniUploadedFile.phpinlaravel/vendor并且它们具有相同的值。

如果您有任何想法...谢谢。

4

1 回答 1

0

我知道现在回答已经晚了,但为了别人的知识。我对 laravel 6 有同样的问题。

C:\xampp\tmp\phpA5C6.tmp 的统计失败

这个错误指出了确切的原因,这是因为请求获取了扩展名为.tmp的临时上传文件,并尝试将此值分配给您在数据库中的字段。在您的验证中,您强制它仅获取具有已知扩展名的图像。所以我做了这些步骤:

  • 在代码中使用相同的数据库字段名称(图像)在刀片文件中创建隐藏输入。

    
    <input type="hidden" id="image" name="image">
    

    并将文件输入字段重命名为与数据库列名称无关的其他名称(比如 some_pic)

  • 在您的控制器中,验证后,上传您的文件,然后准备插入数据库

     $imageName = time().'.'.$request->some_pic->extension();

    $request->some_pic->move(public_path('images'), $imageName);

    if ($request->has('some_pic')) { $request->merge(['image' => $imageName]); }

    那么您将在插入请求时排除文件输入

    $post=Post::create($request->except('some_pic'));
于 2020-02-07T14:11:49.097 回答