【发布时间】:2018-07-19 06:08:21
【问题描述】:
我正在尝试使用拖放在 JavaScript 中创建小型上传。我已经编写了代码,但它似乎不起作用。目前网站的工作方式,上传脚本必须为网站提供PHPSESSID等信息,服务器处理请求的附加数据和文件本身。如果用户删除了多个文件,脚本应该一个一个地上传所有文件。但是目前我什至无法让 JavaScript 上传一个文件。在调试工具中查看时,服务器响应的是网站本身,而不是用于文件上传的响应。
在旧版本代码上使用现有表单上传文件时,我注意到在发送文件内容之前来自网络浏览器的请求如下所示:
Content-Disposition: form-data; name="file"; filename="file.txt"
Content-Type: text/plain
但是,当使用我使用的脚本发送时,我只看到了这个:
Content-Disposition: form-data; name="file"
但是我不确定代码有什么问题,也找不到任何有用的东西来解决这个问题。
我不想使用额外的库,例如 JQuery 或类似的东西
Javascript 代码:
function drop(e){
e.preventDefault();
if(e.dataTransfer.items){
for(var i=0; i < e.dataTransfer.items.length; i++){
var reader = new FileReader();
var req = new XMLHttpRequest();
var f = e.dataTransfer.files[i]
req.onprogress = function(e){
if (e.lengthComputable){
console.log("progress: " + e.loaded / e.total);
}
}
req.open("POST", document.location, true);
req.setRequestHeader("Content-Type", "application/octet-stream");
reader.onload = function(e){
var fd = new FormData();
fd.append("PHPSESSID", document.cookie.split("=")[1]);
fd.append("request", JSON.stringify({"command":"upload", "path":path + f.name, "path-type":pathtype}))
fd.append("file", e.target.result);
req.send(fd);
}
reader.readAsBinaryString(e.dataTransfer.items[i].getAsFile());
}
}else{
for(var i=0; i < e.dataTransfer.files.length; i++){
console.log(e.dataTransfer.files[i]);
}
}
}
负责上传的 PHP 代码:
if(isset($_POST['request'])){
$request = json_decode($_POST['request'], true);
if($request['command'] == "upload"){
if(isset($request['path']) && isset($request['path-type'])){
$path = "";
if($request['path-type'] === "private"){
$path = truepath($private_dir . $request['path']);
if(!(substr($path, 0, strlen($private_dir)) === $private_dir)){
die();
}
}elseif($request['path-type'] === "public"){
$path = truepath($public_dir . $request['path']);
if(!(substr($path, 0, strlen($public_dir)) === $public_dir)){
die();
}
}else{
die();
}
move_uploaded_file($_FILES["file"]["tmp_name"], $path);
die();
}
}
die();
}
【问题讨论】:
标签: javascript php file-upload