我正在尝试使用jQuery / AJAX / Laravel从拖放事件上传多个文件。
MY DROP EVENT:
$( document ).on('drop dragleave', '.file-drag', function(e){
$(this).removeClass('drop-ready');
if(e.originalEvent.dataTransfer.files.length) {
e.preventDefault();
e.stopPropagation();
if (e.type === "drop") {
var files = e.originalEvent.dataTransfer.files;
AjaxFileUpload(files)
}
}
});
我的上传脚本:
function AjaxFileUpload(files){
console.log(files);
//Start appending the files to the FormData object.
var formData = new FormData;
formData.append('_token', CSRF_TOKEN);
for(var i = 0; i < files.length; i++){
formData.append(files[i].name, files[i])
}
console.log(formData.entries());
$.ajax({
//Server script/controller to process the upload
url: 'upload',
type: 'POST',
// Form data
data: formData,
// Tell jQuery not to process data or worry about content-type
// You *must* include these options!
cache: false,
contentType: false,
processData: false,
// Error logging
error: function(jqXHR, textStatus, errorThrown){
console.log(JSON.stringify(jqXHR));
console.log('AJAX Error: ' + textStatus + ": " + errorThrown);
},
// Custom XMLHttpRequest
xhr: function() {
var myXhr = $.ajaxSettings.xhr();
if (myXhr.upload) {
// For handling the progress of the upload
myXhr.upload.addEventListener('progress', function(e) {
if (e.lengthComputable) {
$('progress').attr({
value: e.loaded,
max: e.total,
});
}
} , false);
}
return myXhr;
},
success: function(data){
console.log(data);
}
});
}
MY CONTROLLER CODE:
class UploadsController extends Controller
{
public function UploadFiles(Request $request){
return $request->all();
}
}
我认为我的图像正在进入服务器端,因为当我返回请求对象时,我在控制台中获得以下内容:
因此,CSRF令牌正在通过,图像(我认为?)正在通过。我的问题是从PHP访问文件并通过 - &gt; store();。
存储它们在无数的在线/文档示例中,它们通常使用以下内容:
$path = $request->photo->store('images');
但是,我不明白这个'照片'方面。如果上传视频或PDF怎么办?我基本上不明白我是如何访问请求对象的不同部分的。 Laravel网站上的文档非常稀疏,仅提供了一个使用“照片”的例子,它从未解释过。
答案 0 :(得分:0)
关于Laravel文档中的示例,“照片”只是使用魔术方法来引用以“照片”名称上传的文件。您可以将“照片”替换为您的特定文件名。可以在here找到能够在您上传的文件中调用的特定功能。
答案 1 :(得分:0)
想出来。
在我的uploadscontroller中:
class UploadsController extends Controller
{
public function UploadFiles(Request $request){
$arr = [];
foreach($request->all() as $file){
if(is_file($file)){
$string = str_random(16);
$ext = $file->guessExtension();
$file_name = $string . '.' . $ext;
$filepath = 'uploads/' . Auth::user()->username . '/' . $file_name;
$file->storeAs(('uploads/' . Auth::user()->username), $file_name);
array_push($arr, [$file_name, $filepath]);
}
}
return $arr;
}
}
答案 2 :(得分:0)
这花了我一段时间,但我终于得到了一个有效的解决方案。我使用Dropzone,因此getAcceptedFiles()返回文件对象列表,但它应该是相同的概念。我还将文件附加到现有表单。
上传强>
Could not complete request:org.springframework.web.util.NestedServletException: Handler processing failed; nested exception is java.lang.Error: **Problem loading Module.4**
Caused by:java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.8.0_131] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) [rt.jar:1.8.0_131] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [rt.jar:1.8.0_131] at java.lang.reflect.Method.invoke(Method.java:498) [rt.jar:1.8.0_131] ... 79 more
**Caused by: java.lang.SecurityException: Toolkit not encapsulated by a jar.**
at com.rsa.jcm.f.hz.a(Unknown Source) [jcmFIPS-6.1.3.3.jar:6.1]
at com.rsa.jcm.f.js.b(Unknown Source) [jcmFIPS-6.1.3.3.jar:6.1]
at com.rsa.crypto.jcm.ModuleLoader.a(Unknown Source) [jcmFIPS-6.1.3.3.jar:6.1]
at com.rsa.crypto.jcm.ModuleLoader.load(Unknown Source) [jcmFIPS-6.1.3.3.jar:6.1]
20:24:06,871 ERROR [com.utxfrmwk.util.ExceptionUtils] (http-CDCUDRIFDAPP1/10.40.18.113:3010-4) Exception raised: : java.lang.Error: Problem loading Module.4
at com.rsa.cryptoj.o.by.f(Unknown Source) [cryptojcommon-6.1.3.3.jar:6.1.3.3]
at com.rsa.cryptoj.o.by.c(Unknown Source) [cryptojcommon-6.1.3.3.jar:6.1.3.3]
at com.rsa.cryptoj.o.cf.a(Unknown Source) [cryptojcommon-6.1.3.3.jar:6.1.3.3]
at com.rsa.cryptoj.o.ce.b(Unknown Source) [cryptojcommon-6.1.3.3.jar:6.1.3.3]
Looking for your prompt support and cooperation's .
regards
Ashish
<强>控制器:强>
var formElement = document.getElementById("addForm");
var formData = new FormData(formElement);
// Attach uploaded files to form submission
var files = myDZ.getAcceptedFiles(); // using Dropzone
for (var i = files.length - 1; i >= 0; i--) {
formData.append('files[]', files[i]);
}
$.ajax({
url: 'home/',
data: formData,
processData: false,
contentType: false,
timeout: 1000,
type: 'POST',
headers: {
'X-CSRF-TOKEN': Laravel.csrfToken,
},
success: function(){
...
},
error: function (jqXHR, textStatus) {
...
}
});
Dropzone脚本:
foreach($request->only('files') as $files){
foreach ($files as $file) {
if(is_file($file)) { // not sure this is needed
$fname = $file->getClientOriginalName();
$fpath = $file->store('docs'); // path to file
}
}
}