javascript - 使用ajax上传多个文件
问题描述
嗨,我有一个模式来上传多个图像,如下所示,并且想上传图像并返回错误消息或成功消息。问题是我似乎无法处理所有图像。我在 javascript 中创建了一个表单数据,我在其中附加了所有文件,但从 php 中我似乎无法处理所有这些文件。知道为什么吗?
<!-- Modal -->
<div class="modal fade" id="uploadImages" role="dialog">
<div class="modal-dialog modal-lg">
<!-- Modal content-->
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal">×</button>
<h4 class="modal-title">Upload Scanned Images</h4>
</div>
<div class="modal-body" id="body">
<form method="POST" enctype="multipart/form-data">
Select file : <input type='file' name='file[]' id='file' class='form-control' multiple=""><br>
<input type='submit' class="btn btn-info" value="Upload File" id='but_upload' name='submit'>
</form>
<script src="uploadImages.js"></script>
</div>
<div class="modal-footer">
<p>Only jpeg, png, bmp and tiff Images are allowed to be uploaded</p>
</div>
</div>
</div>
</div>
我也有一个 javascript 来发送一个 ajax 帖子:
$(document).ready(function () {
$("#but_upload").click(function () {
var filedata = $('#file')[0];
var formdata = false;
if (window.FormData) {
formdata = new FormData();
}
var i = 0,
len = filedata.files.length,
img, reader, file;
for (i = 0; i < len; i++) {
file = filedata.files[i];
if (formdata) {
formdata.append("file", file);
}
}
$.ajax({
url: 'uploadImages3.php',
type: 'post',
data: formdata,
contentType: false,
processData: false,
success: function (response) {
alert(response);
},
});
});
});
这是我的 php 文件
<?php
/* Getting file name */
$filename = $_FILES['file']['name'];
/* Location */
$location = "SavedImages/" . $filename;
$uploadOk = "No Errors";
$imageFileType = pathinfo($location, PATHINFO_EXTENSION);
$extensions = ['jpg', 'jpeg', 'png', 'gif', 'tiff'];
$all_files = count($_FILES['file']['name']);
for ($i = 0; $i < $all_files; $i++) {
$file_name = $_FILES['file']['name'][$i];
$file_tmp = $_FILES['file']['tmp_name'][$i];
$file_type = $_FILES['file']['type'][$i];
$file_size = $_FILES['file']['size'][$i];
$file_ext = strtolower(end(explode('.', $_FILES['file']['name'][$i])));
$file = $path . $file_name;
if (!in_array($file_ext, $extensions)) {
$uploadOk = $uploadOk . 'Extension not allowed: ' . $file_name . ' ' . $file_type;
}
if ($file_size > 2097152) {
$uploadOk = $uploadOk . 'File size exceeds limit: ' . $file_name . ' ' . $file_type;
}
if (file_exists($file)) {
$uploadOk = $uploadOk . 'File already exists: ' . $file_name . ' ' . $file_type;
}
if ($uploadOk != "No Errors") {
echo $uploadOk;
} else {
/* Upload file */
if (move_uploaded_file($_FILES['file']['tmp_name'], $location)) {
echo "File saved";
} else {
echo $uploadOk;
}
}
}
解决方案
你有:
formdata.append("file", file);
使用 PHP 时,如果您有多个具有相同名称的表单字段,则该名称必须以该名称结尾,[]
否则只有其中一个可用。
不过,在 JS 中手动循环文件是毫无意义的。
- 将事件处理程序绑定到表单的提交事件
- 使用表单填充 FormData 对象
您还需要防止默认行为 - 在单击提交按钮时正在运行 JS,但正常的表单提交将继续并加载新页面(在运行时终止 JS 程序)。
这样的:
$("form").on("submit", function(e) {
e.preventDefault();
var formdata = new FormData(this);
$.ajax({
url: 'uploadImages3.php',
type: 'post',
data: formdata,
contentType: false,
processData: false,
success: function(response) {
alert(response);
},
});
});
然后你的 PHP 将有一个文件数组,每个文件都有名称等。它不会有一个文件,包含一个名称数组等。
$_FILES['file']['name'][$i];
应该是$_FILES['file'][$i]['name'];
,你的计数方法也是错误的。
不过,使用 foreach 循环更容易:
foreach ($_FILES['file'] as $file) {
$file_name = $file['name'];
# etc
}
推荐阅读
- html - 带有顶栏、侧边栏和重复内容的 CSS 网格
- swiftui - 点击 NavigationLink 后如何执行操作?
- c++ - c++ 标准是否指定了运算符&&(内置)的评估顺序?
- google-cloud-platform - 创建 TPU 节点时的“IP 地址范围”是什么?
- python - 要创建一个系列,我的理解是否正确,它必须具有索引以及如何将数据框中的选定行转换为列表
- javascript - 导出函数以将参数和常量传递给另一个函数
- angular - CORS 拒绝 Cors 政策 (.WithOrigins) 中指定的白名单地址
- ruby-on-rails - 在“before_validation”回调错误代码中销毁持久记录?
- java - 通过命令行从 Java 类运行方法
- signalr - 是什么导致 SignalR WebSocketException - 到达文件末尾?