Как вставлять изображения в db с помощью запроса ajax post в laravel?
Laravel view:
<form enctype="multipart/form-data" method="post" name="imagesform" id="imagesform" >
<input type="hidden" name="_token" value="{{ csrf_token()}}">
<div>
<label id="show" for="files" class="button">Upload photo</label>
<input id="files" name="images" style="visibility:hidden;" type="file">
</div>
<button type="submit" class="save" id="saveImage" style="border-radius: 8px; padding: 5px 15px;">SAVE</button>
</form>
Это мой код для загрузки изображений (это происходит внутри моей модели начальной загрузки). Когда я загружаю изображение и нажимаю кнопку отправки, изображение должно быть вставлено в db, и то же самое нужно извлечь и отобразить на экране стр.
Код Ajax:
$("#saveImage").click(function(e){
// var formdata=new FormData($("#imagesform")[0]);
//alert(formdata);
$.ajaxSetup({
headers: { 'X-CSRF-TOKEN': $('meta[name="_token"]').attr('content') }
});
$.ajax({
url: 'saveImages/{{$dataId}}',
type: 'POST',
data:new FormData($("#imagesform")),
success: function (data) {
alert(data)
},
cache: false,
processData: false
});
return false;
});
Это код ajax, я попробовал.Но предупреждение formdata показывает [object FormData], а в консоли браузера отображается Method not allowed exception
Маршрут Laravel:
Route::post('saveImages/{dataId}',['as' => 'saveImages','uses'=>'[email protected]']);
Контроллер:
public function saveImages(Request $imagesform,$dataId)
{
if (Input::hasFile('images'))
{
$name = $this->getImageId().".".$imagesform->file('images')->getClientOriginalExtension();
$image = $imagesform->file('images');
$resize = Image::make($image)->resize(700, 300)->encode($imagesform->file('images')->getClientOriginalExtension());
$hash = md5($resize->__toString());
$path = "public/" . $name;
Storage::put($path, $resize->__toString());
}
$insertImages=new photosModel;
$insertImages->imagesid=$this->getimagesId();
$insertImages->deviceCategoryId=$dataId;
$insertImages->uploadedImages=$name;
$insertImages->save();
return $this->formImages($dataId);
}
public function formImages($dataId){
$dataId=$dataId;
$images=photosModel::all();
return view('addProductDetails1')->with('images',$images)->with('dataId',$dataId);
}
Ответы
Ответ 1
Для загрузки файлов через AJAX вам необходимо использовать XHR Level 2. Класс FormData
нуждается в HTMLFormElement
в конструкторе, если вы хотите отправить его значение ключа.
Вы должны использовать:
new FormData( document.getElementById('imagesform') );
Также вы можете использовать с jQuery:
new FormData( $("#imagesform").get(0) )
Проверьте мой ответ в другом подобном вопросе, чтобы получить дополнительную информацию.
UPDATE:
Увидев ваши комментарии, ваша проблема связана с маршрутом Laravel. Если код ошибки равен 500 и отображается сообщение "Метод не разрешен", вам нужно проверить свои маршруты в routes/web.php. Пожалуйста, введите здесь stacktrace ошибки и файл маршрута (используйте пастебин или аналогичный).
Ответ 2
Мне удалось решить подобную проблему, используя Frankensteining различные предложения здесь. Эта ссылка содержит кучу действительно хорошей информации. Вам необходимо назначить некоторые опции в вызове ajax для false. В любом случае это то, что сработало для меня:
HTML
<input name="image" type="file" id="image">
Javascript
data = new FormData();
jQuery.each(jQuery('#image')[0].files, function(i, file) {
data.append('image', file);
});
$.ajax({
url: "submit/ajax",
type: 'POST',
cache: false,
contentType: false,
processData: false,
data: data,
success: function(response)
{
// Display your uploaded image on the page
}
});
PHP
Image::make($_FILES['image']['tmp_name']) >save("$myImageDirectory/$newImagegName");