无法在 Laravel 中将上传的文件数组发送到控制器
Unable to send array of uploaded files to controller in Laravel
我有一个联系表单,允许用户上传多个文件。我使用 formData
的 ajax 方法将所有文件发送到我的控制器。我想将所有上传的文件从我可以处理文件的地方获取到我的控制器中。
当我执行 dd();它 returns null.
Blade
<form method="POST" enctype="multipart/form-data")}}">
<div id="dropzoneLover" class="dropzone"></div>
<input type="file" class="form-control" name="documents[]" multiple/>
</form>
Javascript
<script>
Dropzone.autoDiscover = false;
$("#dropzoneLover").dropzone({
url: "{{route('form_for_car_lovers')}}",
autoProcessQueue: false,
uploadMultiple: true,
init: function() {
dzClosure = this;
document.getElementById("submit-all").addEventListener("click",
function(e) {
e.preventDefault();
e.stopPropagation();
dzClosure.processQueue();
}),
this.on("sendingmultiple", function(data, xhr, formData) {
formData.append("_token", "{{ csrf_token() }}");
$('input[name="documents[]"]').each(function (index, member)
{
var getDocs = $(member).val();
formData.append('documents[]', getDocs);
});
}),
}
});
</script>
控制器
public function myfiles()
{
$test = $request['documents'];
$test1 = $request->documents;
$test2 = $request->file('documents');
dd($test,$test1,$test2); // All variables returns null
}
您只需在 formData
中附加实际的 file
对象,如下所示:
jQuery(这段代码已经过测试,可以完美运行)
Dropzone.autoDiscover = false;
$("#dropzoneLover").dropzone({
url: "upload.php",
previewsContainer: ".dropzone-previews",
autoProcessQueue: false,
uploadMultiple:true,
init: function() {
var myDropzone = this;
//Click
document.getElementById("submit-all").addEventListener("click", function(e) {
e.preventDefault();
e.stopPropagation();
myDropzone.processQueue();
});
//On sending
myDropzone.on("sending", function(file, xhr, formData) {
formData.append("_token", "{{ csrf_token() }}");
var getDocuments = $('input[name="documents[]"]')[0].files
$.each(getDocuments, function(index, file) {
formData.append('documents[]', file);
});
//All the other formData goes below this
});
}
});
在您的 laravel 控制器中
var_dump($request->file('documents'))
这是另一种替代方法。
我更换了我的代码
$('input[name="documents[]"]').each(function (index, member)
{
var getDocs = $(member).val();
formData.append('documents[]', getDocs);
});
有了这个
var getDocuments = document.getElementById('documents').files.length;
for (var x = 0; x < getDocuments; x++) {
formData.append("documents[]",
document.getElementById('documents').files[x]);
}
像这样获取值数组并将其拆分到控制器中
$docs = $request->documents;
foreach ($docs as $doc) {
$docname = $doc->getClientOriginalName();
$docNames[] = $docname; // Store all Images into array
$getuploadedImages = collect($docNames)->implode(',');
}
dd($getuploadedImages);
我有一个联系表单,允许用户上传多个文件。我使用 formData
的 ajax 方法将所有文件发送到我的控制器。我想将所有上传的文件从我可以处理文件的地方获取到我的控制器中。
当我执行 dd();它 returns null.
Blade
<form method="POST" enctype="multipart/form-data")}}">
<div id="dropzoneLover" class="dropzone"></div>
<input type="file" class="form-control" name="documents[]" multiple/>
</form>
Javascript
<script>
Dropzone.autoDiscover = false;
$("#dropzoneLover").dropzone({
url: "{{route('form_for_car_lovers')}}",
autoProcessQueue: false,
uploadMultiple: true,
init: function() {
dzClosure = this;
document.getElementById("submit-all").addEventListener("click",
function(e) {
e.preventDefault();
e.stopPropagation();
dzClosure.processQueue();
}),
this.on("sendingmultiple", function(data, xhr, formData) {
formData.append("_token", "{{ csrf_token() }}");
$('input[name="documents[]"]').each(function (index, member)
{
var getDocs = $(member).val();
formData.append('documents[]', getDocs);
});
}),
}
});
</script>
控制器
public function myfiles()
{
$test = $request['documents'];
$test1 = $request->documents;
$test2 = $request->file('documents');
dd($test,$test1,$test2); // All variables returns null
}
您只需在 formData
中附加实际的 file
对象,如下所示:
jQuery(这段代码已经过测试,可以完美运行)
Dropzone.autoDiscover = false;
$("#dropzoneLover").dropzone({
url: "upload.php",
previewsContainer: ".dropzone-previews",
autoProcessQueue: false,
uploadMultiple:true,
init: function() {
var myDropzone = this;
//Click
document.getElementById("submit-all").addEventListener("click", function(e) {
e.preventDefault();
e.stopPropagation();
myDropzone.processQueue();
});
//On sending
myDropzone.on("sending", function(file, xhr, formData) {
formData.append("_token", "{{ csrf_token() }}");
var getDocuments = $('input[name="documents[]"]')[0].files
$.each(getDocuments, function(index, file) {
formData.append('documents[]', file);
});
//All the other formData goes below this
});
}
});
在您的 laravel 控制器中
var_dump($request->file('documents'))
这是另一种替代方法。
我更换了我的代码
$('input[name="documents[]"]').each(function (index, member)
{
var getDocs = $(member).val();
formData.append('documents[]', getDocs);
});
有了这个
var getDocuments = document.getElementById('documents').files.length;
for (var x = 0; x < getDocuments; x++) {
formData.append("documents[]",
document.getElementById('documents').files[x]);
}
像这样获取值数组并将其拆分到控制器中
$docs = $request->documents;
foreach ($docs as $doc) {
$docname = $doc->getClientOriginalName();
$docNames[] = $docname; // Store all Images into array
$getuploadedImages = collect($docNames)->implode(',');
}
dd($getuploadedImages);