【问题标题】:Image saving in database as C:\wamp64\tmp\phpAE1C.tmp instead of saving in public/images图像在数据库中保存为 C:\wamp64\tmp\phpAE1C.tmp 而不是保存在 public/images
【发布时间】:2021-03-02 02:20:59
【问题描述】:

我正在尝试编辑/更新用户表中的图像,当我选择一个新图像并提交表单时,图像名称不会存储在数据库中,而是这个 C:\wamp64\tmp\phpAE1C.tmp保存在图片栏,我不知道为什么,如果你知道为什么,请帮忙。

用户控制器

 public function update(Request $request, $id)
{
    $request->validate([
        'name' => 'required|string|max:225',
        'email' => 'required|string|email|max:255|unique:users,email,'.auth()->id(),
        'password' => 'sometimes|nullable|string|min:6|confirmed',
    ]);

    $user = auth()->user();

    //Handle avatar Upload
        if ($request->hasFile('avatar')) {
            // Get filename with extention 
            $filenamewithExt = $request->file('avatar')->getClientOriginalName();
            // Get just filename
            $filename = pathinfo($filenamewithExt, PATHINFO_FILENAME);
            // Get just Extention
            $extention = $request->file('avatar')->getClientOriginalExtension();
            // Filename to store
            $filenameToStore = $filename.'_'.time().'.'.$extention;
            // Upload Image
            $path = $request->file('avatar')->storeAs('public/avatars', $filenameToStore);

        }

        if ($request->hasFile('avatar')) {
            
            $user->avatar = $filenameToStore;
      
           
        }

        //Handle image Upload

        if ($request->hasFile('image')) {
            // Get filename with extention 
            $ImageNameWithExt = $request->file('image')->getClientOriginalName();
            // Get just filename
            $ImageName = pathinfo($ImageNameWithExt, PATHINFO_FILENAME);
            // Get just Extention
            $Extentions = $request->file('image')->getClientOriginalExtension();
            // Filename to store
            $ImageNameToStore = $ImageName.'_'.time().'.'.$Extentions;
            // Upload Image
            $paths = $request->file('image')->storeAs('public/images', $ImageNameToStore);
    
        }
    
        if ($request->hasFile('image')) {
            
            $user->image = $ImageNameToStore;

            
        }
        
        $user->save();
    
    $input = $request->except('password', 'password_confirmation');

    if (!$request->filled('password')) {
        $user->fill($input)->save();

        return back()->with('success', 'Profile updated successfully!');
    }
    
    $user->password = bcrypt($request->password);
    $user->fill($input)->save();
    
    return back()->with('success', 'Profile and password updated successfully');
}

edit.blade 中的图片输入字段

 <div class="form-group col-md">
        
        <div class="custom-file">
        <input type="file" name="image" class="custom-file-input" id="customFile" >
        <label class="custom-file-label text-align-left" style="text-align:left;" 
        for="customFile">Choose file</label>
        </div>

        </div>

【问题讨论】:

  • 图片是否正确保存在您的目录中?
  • 我认为您不应该将“public”指定为路径的一部分。 storeAs() 方法的第三个参数是磁盘名称。还有$user-&gt;password = bcrypt($request-&gt;password);是什么???不要这样做。使用Hash 门面。
  • @sta no 图像没有保存在目录中
  • 默认文件系统使用名为“本地”的默认磁盘,使用 store、stroeAs 等将文件上传到 storage/app 文件夹存储中
  • @sta 好的将使用哈希,但我使用 public 作为存储头像图像的路径的一部分,它工作正常,并且在创建注册用户时我使用 public/images 并且也是工作正常!

标签: laravel image file-upload upload edit


【解决方案1】:

我建议你改变这个:

$input = $request->except('password', 'password_confirmation');

到,

$input = $request->except('password', 'password_confirmation','image','avatar');

if ($request->hasFile('image')) {
      $input['image'] = $ImageNameToStore;
}

if ($request->hasFile('avatar')) {
      $input['avatar'] = $filenameToStore;
}

当使用fill 或update 来持久化请求数据时,最好排除图像字段。对于请求数据中的任何上传图像,将原始图像数据存储在数据库中没有多大意义。

相反,图像可以存储在本地磁盘或 S3 之类的磁盘上,而保存图像的 path 应该存储在与头像字段对应的数据库中

【讨论】:

  • 我认为您说得对,但最好解释一下为什么要进行此更改。也可以改进他们的代码,这样他们就不会多次保存!
  • 好的,我刚刚查看了public/images目录,图片已经保存,但是图片名称还是保存在图片列中的C:\wamp64\tmp\phpAE1C.tmp
  • 好的,我会试试你的建议,谢谢
  • @miken32 更改是当用户想要编辑他们的个人资料页面信息时,该信息也有他们在注册期间上传的图像,因此当他们希望更改他们最初上传的图像时可以这样做。 sta 的建议对我有用,但我是一个学习者,如果有其他方法可以做到这一点,如果你与我分享,我将不胜感激。谢谢
  • 每当$request 中有图像字段时,使用fill 或update 方法时最好排除这些字段,而是使用path 保存文件。我知道的一件事是,通过 ajax 请求,图像/文件以二进制格式接收,将原始图像数据存储在数据库中没有意义 - @miken32
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-11
  • 1970-01-01
  • 2017-04-03
  • 2011-02-02
  • 2015-08-13
  • 2021-11-08
  • 1970-01-01
相关资源
最近更新 更多