传递一个'拖放'文件转换为php
Pass a 'drag and dropped' file to php
我正在尝试访问php中上传的文件。用户可以通过两种方式上传文件。可以拖放,也可以点击上传。我使用ajax将数据传递到php。我在JQuery中访问文件的方式是
new FormData($('#uploadform')[0])
然后在php中,我做了print_r($_FILES)
。当用户点击上传时,它会按照应该的方式打印出来。但当用户拖放文件时,它会打印出以下内容:
Array
(
[img] => Array
(
[name] =>
[type] =>
[tmp_name] =>
[error] => 4
[size] => 0
)
)
我也尝试过(拖放)
evt.originalEvent.dataTransfer.files[0];
我得到了一个完全空的数组。
如何将"拖放"图像传递到php?
JSFiddle
$(document).ready(function() {
"use strict";
$('#uploadform').on('change', function(evt) {
var formData = new FormData($(this)[0]);
$.ajax({
url: $(this).attr("action"),
context: document.body,
data: formData,
type: "POST",
timeout: 15000,
contentType: false,
processData: false,
success: function(data) {
// Perform something upon success
},
error: function(jqXHR, textStatus) {
// Perform something upon error
}
});
return false;
});
$('#lbl').on('dragover', function(evt) {
evt.stopPropagation();
evt.preventDefault();
});
$('#lbl').on('drop', function(evt) {
evt.stopPropagation();
evt.preventDefault();
var formData = new FormData($(this)[0]);
// Also tried:
// var formData = evt.originalEvent.dataTransfer.files[0];
$.ajax({
url: $('#uploadform').attr("action"),
context: document.body,
data: formData,
type: "POST",
timeout: 15000,
contentType: false,
processData: false,
success: function(data) {
// Perform something upon success
},
error: function(jqXHR) {
// Perform something upon error
}
});
return false;
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form action="upload.php" enctype="multipart/form-data" method="POST" id="uploadform">
<input id="openFile" name="img" type="file" />
<label for="openFile" name="lblImage" id="lbl"></label>
</form>
由于您已经在使用jQuery,我强烈建议您使用blueimp的jQuery File Upload来完成此任务。以一种在所有(主要)浏览器中都能工作的方式实现这一点是一件痛苦的事情。
如果你坚持自己做这件事,以下步骤是必要的:
- 取消
dragover
和dragenter
事件(preventDefault
+stopPropagation
) -
获取
drop
上的数据$('#uploadform').on('drop', function (ev) { if (ev.originalEvent.dataTransfer && ev.originalEvent.dataTransfer.files.length) { ev.preventDefault(); ev.stopPropagation(); upload(e.originalEvent.dataTransfer.files); } });
-
通过XHR 上传文件
var formData = new FormData(); for (var i = 0, file; file = files[i]; ++i) { formData.append(file.name, file); } var xhr = new XMLHttpRequest(); xhr.open('POST', '/upload.php', true); xhr.onload = onUploadCompleted; xhr.send(formData);
-
在PHP后端中以不同方式处理通过XHR上传的文件
这意味着你必须满足3种上传文件的方式:
- HTML表单+文件输入
- XHR多部分上传
- XHR非多部分上传
你自己写可能会很复杂!(示例来自jQuery文件上传源)
PHP$_FILES数组将从"file"类型的所有表单元素中获取值。
要调试脚本,请粘贴一行JavaScript/jQuery,该行执行alert()函数并显示id为"openfile"的元素的值。当表单提交时,将其放在事件触发器中。
可能是该拖放功能没有设置该文件表单字段的值。如果没有,那么我们将不得不找到其他方法来实现拖放功能,或者将文件转换为PHP。
遇到了同样的问题。调试这样的行为并非易事,但请尝试检查PHP ini设置upload_max_filesize-如果它小于所有文件大小的总和,则PHP将不接受所有文件,只打印空数组。
相关文章:
- html5拖放文件-在提交整个表单时上传
- 拖放文件上传无需AJAX,在前台同步
- 为什么这个文件上传拖放不起作用,我完全复制了 CodePen 代码
- Jstree在拖放后将树保存到xml文件中
- 文件上载(拖放)无法工作
- 拖放文件时,dataTransfer.items属性在Firefox和IE中未定义,但在Chrome中未定义
- 上传文件时检测到已取消的拖放操作
- HTML5拖放:使用JavaScript在文本框中加载文本文件
- 将普通表单与文件输入与拖放区相结合
- HTML5拖放文件字段
- 从单独的文件加载拖放区不会加载
- JavaScript/HTML5/jQuery 拖放上传 - “未捕获的类型错误:无法读取未定义的属性'文件
- 使用拖放区将文件直接上传到 Azure Blob 存储(使用 SAS).js
- 当拖放区域中没有文件时禁用“提交”按钮
- 拖放以克隆原始文件
- 使用 nodejs 上传文件,使用拖放区快速和角度
- 我如何通过Chrome扩展模拟文件拖放上传
- 我可以使用HTML5通过单个文件拖放多个文件吗?
- AngularJS文件拖放指令
- Javascript -双文件拖放事件触发