php - 我无法使用 Laravel 和 Dropzone.js 上传文件
问题描述
我正在尝试使用 Laravel 和 Dropzone.js 作为友好的 UI 上传文件。
根据Enyo 的教程和官方文档以及本教程的西班牙语this one和that one。但我就是想不通为什么我不能在request
对象中接收我实际尝试上传的文件。
我的代码如下所示:
我的观点:
<div class="box-body">
{!! Form::open(['url' => '/admin/noticias', 'files' => true], ['id' => 'form' ]) !!}
<div class="form-group {{ $errors->has('file_gallery') ? 'has-error' : ''}}">
{!! Form::label('File', 'Arrastre fotos a esta área') !!}
<div class="row">
<div class="col-md-10">
<input class="file" name="file[]" type="file" id="file" multiple/>
<div id="mydropzone" class="dropzone">
<!--Sector de arrastre-->
</div>
{!! $errors->first('file', '<p class="help-block">:message</p>') !!}
</div>
</div>
</div>
<button id='btn_submit' type="submit" class="btn btn-primary"><i class="fa fa-fw fa-save"></i>Save</button>{{ Form::close() }} <script type="text/javascript" src="{{asset('js/jquery-ui-1.11.4/jquery-ui.js')}}"></script>
<link rel="stylesheet" href="{{asset('js/dropzone/dropzone.css')}}">
<script type="text/javascript" src="{{asset('js/dropzone/dropzone.js')}}"></script>
<script type="text/javascript">
$('#datepicker_ini').datepicker({
language: 'es',
autoclose: true
});
$(function () {
Dropzone.autoDiscover = false;
$("div#mydropzone").dropzone({
// method: 'GET',
url: '{{route('admin.noticias.upload_gallery')}}',
paramName: "file_gallery",
autoProcessQueue: false,
uploadMultiple: false,
addRemoveLinks: true,
parallelUploads: 10,
maxFilesize: 10,
acceptedFiles: ".jpeg,.jpe,.jpg,.png,.gif,.svg",
dictRemoveFile: 'Remover foto',
dictDefaultMessage: "Arrastre las fotos que desea subir aquí.",
dictFallbackMessage: "Tu navegador no soporta arrastrar y soltar fotos",
dictFallbackText: "Por favor, use el boton de seleccionar fotos",
dictInvalidFileType: "No puedes subir archivos de este tipo.",
dictCancelUpload: "Cancelar subida",
dictCancelUploadConfirmation: "¿Está seguro que quiere cancelar esta subida?",
dictMaxFilesExceeded: "No puedes subir más archivos.",
success: function (file, response, data) {
$('#galeria').empty(); // supongo que esto resetea los archivos guardados
var rows = $('div#mydropzone').children('.dz-image-preview').get();
$.each(rows, function (index, row) {
// Agregar cada elemento a #galeria[]
});
},
removedfile: function (file) {
x = confirm('¿Desea remover esta foto?');
if (!x) return false;
file.previewElement.remove();
$('#galeria').empty(); // supongo que esto resetea los archivos guardados
var rows = $('div#mydropzone').children('.dz-image-preview').get();
$.each(rows, function (index, row) {
});
},
init: function () {
var myDropzone = this;
this.element.querySelector("button[type=submit]").addEventListener("click", function (e) {
e.preventDefault();
e.stopPropagation();
myDropzone.processQueue();
});
},
accept: function(file) {
let fileReader = new FileReader();
fileReader.readAsDataURL(file);
fileReader.onloadend = function() {
let content = fileReader.result;
$('#galeria').val(content);
file.previewElement.classList.add("dz-success");
}
file.previewElement.classList.add("dz-complete");
}
}).sortable({
items: '.dz-preview',
cursor: 'move',
opacity: 0.5,
containment: "parent",
distance: 20,
tolerance: 'pointer',
update: function (e, ui) {
$('#galeria').empty();
var rows = $('div#mydropzone').children('.dz-image-preview').get();
$.each(rows, function (index, row) {
// añadir al input #galeria
});
}
});
});
我的控制器看起来像这样
NewsController.php
public function store(Request $request)
{
dd($request->file); // this returns null;
}
public function upload(Request $request)
{
return response()->json(['success' => true], 200); // just did this, in order to provide an URL with a response
}
为什么我要像使用请求表一样保存它,那是因为我使用的是Medialibrary包(实际上还不错)。
TL; DR我想做什么?我正在尝试使用友好的 UI 上传,并使用带有请求 POST 表单的 Medialibrary 包保存图像。
到目前为止我所做的:我已经能够对图像进行排序,但是当我单击提交按钮时,$request->file_galery
它是空的。我不知道为什么。
什么是我的porpouse:我想制作一个友好的用户界面,用户可以上传,排序,删除其中一些(编辑),全部删除。为了做到这一点,我在我的项目中添加了 Medialibrary 作为后端,并为前端添加了 Dropzone。
任何帮助表示赞赏。
解决方案
这就是我所做的
在我的页脚中,我添加了
<script src="https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.5.1/dropzone.js" async></script>
这是我的表格
<form action="/upload-image"
class="dropzone w-100"
id="my-awesome-dropzone">
{{csrf_field()}}
</form>
在我的路线中
Route::post('/upload-image', [
'uses' => 'MyController@uploadImages',
'as' => 'my_controller.uploadImages'
]);
还有我的控制器功能来上传图像
public function uploadImages(Request $request)
{
$image = $request->file('file');
if($image) {
$filenamewithextension = $request->file('file')->getClientOriginalName();
//get filename without extension
$filename = pathinfo($filenamewithextension, PATHINFO_FILENAME);
//get file extension
$extension = $request->file('file')->getClientOriginalExtension();
//filename to store
$filenametostore = $filename.'_'.time().'.'.$extension;
Storage::disk('s3_driver')->put($filenametostore, fopen($request->file('file'), 'r+'), 'public');
//do something with $filenametostore
return "something";
}
else {
return 'Fail';
}
}
推荐阅读
- webdriver - 无法在真机上运行测试但在模拟器上运行
- javascript - 如何隐藏 ng-model 的默认范围值
- android - 错误:资源 android:style/TextAppearance.Material 未找到
- c - Bogus '可能在未初始化的情况下使用
- laravel-5.5 - 雄辩查询中的“where”,连接了3个表
- php - 从数据库到可编辑表单的数组
- html - 引导轮播设置自动高度不起作用
- java - JxBrowser 6.19.1 PDF 打印问题
- unity3d - 运行时地形缩放 Unity
- python - 从向量和 np.roll 中减去向量在 Python 中的结果