只有在用户上传了新图片时才更新图片,Laravel

时间:2014-09-07 22:02:54

标签: php laravel

我有一个编辑表单,其中包含一个图像字段,用户可以根据需要上传新图像。

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

这是我的编辑功能:

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');
}

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

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

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

6 个答案:

答案 0 :(得分:0)

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.');
        }

}

答案 1 :(得分:0)

使用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);
    }
}

答案 2 :(得分:0)

检查请求是否包含文件:

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

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

  // ...
}

答案 3 :(得分:0)

您需要将multipart用于表单编码

答案 4 :(得分:0)

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

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);
            }
        }
    }
}

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

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

same this Click here..

我的更新功能

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)]);
}

答案 5 :(得分:-1)

在控制器部分:

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