У меня проблемы с обновлением записи с изображением. Я не знаю, что мне нужно делать. Мое изображение хранится в общедоступной папке с именем «img / products».
Я использую этот метод в моем контроллере для хранения «продукта»
$productImage = $request->file('image');
$productImageName = rand() . '.' . $productImage->getClientOriginalExtension();
$productImage->move(public_path('img/products'), $productImageName);
$products = Product::create([
'name' => $request->name,
'category_id' => $request->category_id,
'description' => $request->description,
'price_neto' => $request->price_neto,
'iva' => $request->iva,
'price_total' => $request->price_total,
'image' => $productImageName,
]);
ProductController.php
В контроллере я больше сомневаюсь, верен мой код или нет.
public function update(Request $request, $id)
{
$validator = Validator::make($request->input(), array(
'name' => 'required',
'category_id' => 'required',
'description' => 'required',
'price_neto' => 'required',
'iva' => 'required',
'price_total' => 'required',
'image' => '',
));
if ($validator->fails()) {
return response()->json([
'error' => true,
'messages' => $validator->errors(),
], 422);
}
$products = Product::find($id);
if ($request->hasFile('image')) {
$path = public_path("img/products/" . $products->image);
if(File::exists($path)) {
File::delete($path);
$productImage = $request->file('image');
$productImageName = rand() . '.' . $productImage->getClientOriginalExtension();
$productImage->move(public_path('img/products'), $productImageName);
$products->image = $productImageName;
}
}
$products->name = $request->name;
$products->category_id = $request->category_id;
$products->description = $request->description;
$products->price_neto = $request->price_neto;
$products->iva = $request->iva;
$products->price_total = $request->price_total;
$products->save();
return response()->json([
'error' => false,
'products' => $products,
]);
}
Product.js
$("#btn-edit").click(function() {
var form = new FormData($("#frmEditProduct")[0]);
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
$.ajax({
type: 'PUT',
url: '/product/' + $("#frmEditProduct input[name=product_id]").val(),
data: form,
processData: false,
contentType: false,
dataType: 'json',
success: function(data) {
$('#frmEditProduct').trigger("reset");
$("#frmEditProduct .close").click();
window.location.reload();
},
error: function(data) {
var errors = $.parseJSON(data.responseText);
$('#edit-product-errors').html('');
$.each(errors.messages, function(key, value) {
$('#edit-product-errors').append('<li>' + value + '</li>');
});
$("#edit-error-bag").show();
}
});
});
Маршрут
Route::group(['prefix' => 'product'], function () {
Route::get('/{id}', [
'uses' => 'ProductController@show',
'as' => 'product.show',
]);
Route::post('/', [
'uses' => 'ProductController@store',
'as' => 'product.store',
]);
Route::put('/{id}', [
'uses' => 'ProductController@update',
'as' => 'product.update',
]);
Route::delete('/{id}', [
'uses' => 'ProductController@destroy',
'as' => 'product.destroy',
]);
});