仅当用户上传新图片 Laravel 时才更新图片

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/25715178/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-14 10:03:51  来源:igfitidea点击:

Only update image if user uploaded a new one, Laravel

phplaravel

提问by himmip

I have an edit form which has an image field where a user can upload a new image if he wants to.

我有一个编辑表单,其中有一个图像字段,用户可以在其中上传新图像。

But if the user does not upload a new photo I don't want to validate the image field and just use the photo that's already in the database. And not update the image field at all.

但是如果用户不上传新照片,我不想验证图像字段而只使用数据库中已有的照片。并且根本不更新图像字段。

Here is my edit function:

这是我的编辑功能:

public function postEdit($id) {

    $product = Product::find($id);

    // This should be in product model, just testing here
    $edit_rules = array(
        'category_id' => 'required|integer',
        'title' => 'required|min:2',
        'description' => 'required|min:10',
        'price' => 'required|numeric',
        'stock' => 'integer'
    );

    // Add image rule only if user uploaded new image
    if (Input::has('image')) {
        $edit_rules['image'] = 'required|image|mimes:jpeg,jpg,bmp,png,gif';
    }

    $v = Validator::make(Input::all(), $edit_rules);

    if ($product) {

        if ($v->fails()) {
            return Redirect::back()->withErrors($v);
        }

        // Upload the new image
        if (Input::has('image')) {
            // Delete old image
            File::delete('public/'.$product->image);

            // Image edit
            $image = Input::file('image');
            $filename = date('Y-m-d-H:i:s')."-".$image->getClientOriginalName();
            Image::make($image->getRealPath())->resize(600, 600)->save('public/img/products/'.$filename);

            $product->image = 'img/products/'.$filename;
            $product->save();
        }

        // Except image because already called save if image was present, above
        $product->update(Input::except('image'));

        return Redirect::to('admin/products')->with('message', 'Product updated.');
    }

    return Redirect::to('admin/products');
}

Using this I can update all the values except the image.

使用它,我可以更新除图像之外的所有值。

If I don't upload a new photo it saves all other updated values.

如果我不上传新照片,它会保存所有其他更新的值。

If I do upload a new photo it just ignores it and saves all other updated values, doesn't upload the new photo.

如果我确实上传了一张新照片,它只会忽略它并保存所有其他更新的值,而不上传新照片。

回答by doncadavona

Check if the request has the file:

检查请求是否有文件:

public function update(Request $request)
{
  // Update the model.

  if($request->hasFile('photo')) {
    // Process the new image.
  }

  // ...
}

回答by Omer YILMAZ

You need to use multipartfor form enctype

您需要使用multipartfor form enctype

回答by xRooT

You can use another function to delete the images from the folder. like here

您可以使用其他功能从文件夹中删除图像。像这儿

private function unlinkPostImages($images)
{
    if(!empty($images)){
        foreach ($images as $img){
            $old_image = public_path('storage/' . $img->image);
            if (file_exists($old_image)) {
                @unlink($old_image);
            }
        }
    }
}

Then call this function above image delete function. like this...

然后在图像删除函数上方调用此函数。像这样...

$this->unlinkPostImages($getId->images); // this will delete image from folder
$getId->images()->delete();     // --> this delete from database table $post->id

same this Click here..

同样这个点击这里..

my update function

我的更新功能

public function update(UpdatePostRequest $request, Post $post)
{
    //
    $data = $request->only(['title', 'description', 'contents', 'price']);

    // ???? ??????? //
    if ($request->hasFile('image')) {

        Storage::disk('public')->delete($post->image);

        $imagePath            = $request->image;
        $filename             = Str::random(10).'-'.time().'-'.$imagePath->getClientOriginalName();
        $image_resize         = Image::make($imagePath->getRealPath());

        $image_resize->fit(120);
        $image_resize->orientate();
        $image_resize->save(public_path('storage/images/' .$filename), 100);

        $sImg                 = 'images/'. $filename;
        $data['image']        = $sImg;

    }
    // -------- //

    if ($request->hasFile('images'))
    {
        $getId = Post::find($post->id);
        $this->unlinkPostImages($getId->images);
        $getId->images()->delete();

        $uploadPicture = array();
        foreach ($request->file('images') as $photo) {
            $file      = $photo;
            $filename  = $file->getClientOriginalName();
            $picture   = date('His').'-'.$filename;

            $file->move(public_path('storage/images/'), $picture);

            array_push($uploadPicture, new PostImages(array('image' => 'images/'. $picture)));
        }

        $post->images()->saveMany($uploadPicture);
    }

    if ($request->input('contents')) {
        $data['content'] = $request->contents;
    }

    //dd($data);
    $post->update($data);
    session()->flash('SUCCESS', '?? ????? ??????? ?????.');
    return redirect()->route('post.show', [$post->id, Post::slug($post->title)]);
}

回答by prathu

public function update() {

    $id=Input::get('id');
    $rules= array('name'=>'required|regex:/(^[A-Za-z]+$)+/',
                        'detail'=>'required|regex:/(^[A-Za-z]+$)+/',
                        'images' => 'required|image');
    $dat = Input::all();

    $validation = Validator::make($dat,$rules);
    if ($validation->passes()){

        $file =Input::file('images');
        $destinationPath = 'image/pack';
        $image = value(function() use ($file){
        $filename = date('Y-m-d-H:i:s') . '.' . $file->getClientOriginalExtension();
        return strtolower($filename);
            });

        $newupload =Input::file('images')->move($destinationPath, $image);


        DB::table('pkgdetail')
                        ->where('id', $id)  
                                ->limit(1)  
                            ->update(array('name' => Input::get('name'), 'detail' => Input::get('detail'), 'image' => $newupload));


        $data=PackModel::get_all();
         return View::make('pkg_dis')->with('data',$data)
                                    ->withErrors($validation)
                                ->with('message', 'Successfully updated.');
        }

}

回答by ashish bansal

use Illuminate\Support\Facades\Input;

使用 Illuminate\Support\Facades\Input;

public function update(Request $request, $id)
{
    if ($tag = Tag::find($id))
    {
        $this->validate($request, [
        'tag_name' => 'required|min:3|max:100|regex: /^[a-zA-Z0-9\s][a-zA-Z0-9\s?]+$/u|unique:tags,tag_name,'.$id.',id',
        ]);
        $tag->tag_name=$request->input('tag_name');

        // get the image tag_img_Val
        if($request->hasFile('tag_image'))
        {
            $this->validate($request, [
            'tag_image' => 'image|mimes:jpeg,png,jpg,gif,svg|max:1000',
            ]);
            $img = $request->file('tag_image');
            $old_image = 'uploads/' . $tag->tag_image;//get old image from storage
            if ($img != '')
            {
                $image = rand() . '_' . ($img->getClientOriginalName());
                $path = 'uploads/';
                //Storing image                
                if ($img->move(public_path($path), $image))
                {
                    $tag->tag_image = $image;
                    if ($tag->update())
                    {
                        if (is_file($old_image)) {
                            unlink($old_image); // delete the old image 
                        }
                        return response()->json(['message' => 'Tag has been updated successfully.'],200);
                    }
                    else
                    {
                        unlink($image); // delete the uploaded image if not updated in database
                        return response()->json(['message' => "Sorry, Tag not updated"],500);
                    }
                }
                else
                {
                    return response()->json(['message' => "Sorry, Image not moved"],500);
                }
            }
            else
            {
                return response()->json(['message' => "Sorry, Image not uploaded"],500);
            }
        }
        else
        {
            if($tag->update(Input::except('tag_image')))
            {
                return response()->json(['message' => 'Tag has been updated successfully.'],200);
            }
            else
            {
                return response()->json(['message' => "Sorry, Tag not updated"],500);
            }
        }
    }
    else
    {
        return response()->json(['message' => 'Tag not found'], 404);
    }
}

回答by pankaj

In controller part:

在控制器部分:

    $destinationPath = 'uploads';
    $extension = Input::file('image')->getClientOriginalExtension();
    var_dump($extension);
    $fileName = rand(11111,99999).'.'.$extension;
    Input::file('image')->move($destinationPath, $fileName);