La gestion de l’upload est simplifiée par Laravel. Nous allons voir dans l’exemple qui suit comment faire un formulaire de téléchargement d’image simple, multiple, comment utiliser la validation dans ces deux cas, et même ajouter une validation personalisé en fonction des dimensions des images. Pour créer un formulaire d’upload basic insérez le code qui suit:
Formulaire d’upload d’image simpl
Pour un téléchargement d’image simple mettez en place le code suivant dans votre fichier html.
{!! Form::open(array('url' => 'backend/account/edit_social','method'=>'POST', 'files'=>true)) !!}
{!! Form::file('image_banner',null) !!}
{!! Form::file('avatar_upload',array('accept'=>'image/*','class'=>'bgtans')) !!}
{!! Form::close() !!}
Pour mettre en place un filtre en fonction de l’extension, remplacez dans l’exemple null par array(‘accept’=>’image/jpeg’) il ajoutera la ligne suivante dans votre entrée l’input html <input … accept= »image/jpeg » …/>
Pour mettre en place la route insérer par exemple la ligne suivante dans votre web.php
//Dans notre cas, il faut être connecté à cause de ->middleware('auth');
Route::post('backend/account/edit_social', ['uses'=>'Backend\AccountController@editsocial'])->middleware('auth');
Et pour finir, dans votre contrôleur (Backend\PicturesController.php dans l’exemple) mettez le code suivante:
namespace App\Http\Controllers\Backend;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\DB;
use App\Http\Requests\FichePictures;
use Validator;
use Illuminate\Support\Facades\Redirect;
class AccountController extends Controller
{
public function editsocial(Request $request)
{
if(null!==($request->file('avatar_upload'))){
$this->validate($request, [
'avatar_upload' => 'image|mimes:jpeg,jpg,png|max:4000',//Permet de limiter la taille et le type de fichier
]);
$arr_original_img = pathinfo($request->file('avatar_upload')->getClientOriginalName());
$path_img_folder = base_path()."/public_html/img/avatar";
$new_img_folder_path = base_path()."/public_html/img/avatar/";
/* On uniformise les extensions*/
switch (strtolower($arr_original_img['extension'])){
case 'jpg':
case 'jpeg':
$new_filename = Auth::user()->id.".jpg";
break;
case 'png':
$new_filename = Auth::user()->id.".png";
break;
}
$new_img_path = $new_img_folder_path.$new_filename;
$file_path_jpg =$path_img_folder."/".Auth::user()->id.".jpg";
$file_path_png =$path_img_folder."/".Auth::user()->id.".png";
/* On supprime l'ancienne image si elle existe*/
if(file_exists($file_path_jpg)){
unlink($file_path_jpg);
} elseif(file_exists($file_path_png)){
unlink($file_path_png);
}
/* on déplace l'image et on change le nom*/
$request->file('avatar_upload')->move($new_img_folder_path,$new_filename); //
$path_parts = pathinfo($new_img_path);
/* Optimisation des images avec jpegoptim */
if($path_parts['extension']=='jpg'){
exec("exec jpegoptim -m80 -P --strip-all ".$new_img_path.";");
}
}
return redirect('backend/account');
}
Upload d’images – multiple
L’exemple suivant met en place un upload d’images et en plus de la validation pour un array d’images, met en place une autre validation en fonction de la taille des images. Pour mettre en place la route insérer par exemple la ligne suivante dans votre web.php
//Dans notre cas, il faut être connecté à cause de ->middleware('auth');
Route::post('multiple_upload', ['as'=>'multiple_upload','uses'=>'Backend\PicturesController@multiple_upload'])->middleware('auth');
Notre controller (Backend\PicturesController.php) contient le code suivant:
namespace App\Http\Controllers\Backend;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\DB;
use App\Helpers\BackendHelper;
use App\Http\Requests\FichePictures; //Permet de mettre en place la validateur personnalisé
use Validator;
use Illuminate\Support\Facades\Redirect;
class PicturesController extends Controller
{
public function multiple_upload(FichePictures $request)//<------ Ma nouvelle classe!!!
{
foreach($request->file('images_file') as $image) {
//...
}
return back()->withInput();
}
}
Et dans cet exemple nous devons créer le fichier suivant : app\ Http\ Requests\ FichePictures.php Soit vous créer directement le fichier, soit vous exécutez la ligne suivant:
php artisan make:request FichePictures
Au final, votre fichier devra contenir les lignes suivantes
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Http\Request;
use Validator;
define("IMG_SIZE_MIN", 600);//taille minimu de l'image
class FichePictures extends FormRequest
{
public function authorize()//Permet de restreindre l'accès
{
return true;
}
protected function getValidatorInstance()
{
return parent::getValidatorInstance()->after(function ($validator) {
$this->after($validator);
});
}
public function rules()
{
$arr_images = Request::file('images_file');
$nbr = count($arr_images) - 1;
foreach(range(0, $nbr) as $index) {
$rules['images_file.' . $index] = 'image|mimes:jpeg,jpg|max:4000';
}
return $rules;
}
public function after($validator)
{
$arr_images = Request::file('images_file');
foreach($arr_images as $image) {
echo $image->getClientOriginalName()."
";
list($width, $height) = getimagesize($image);
echo "--->".$width." x ".$height."
";
if ($widthsetLocale('fr');
$validator->errors()->add('images.0', $image->getClientOriginalName()" ".trans('customlang.img to small'));
}
}
}
}
Voilà, le temps m’a manqué pour détailler toutes les informations nécessaires, mais vous avez au moins un exemple de code complet et fonctionnel.