将 formData 发布到 PHP 文件上传脚本
posting formData to PHP script for file upload
不确定为什么我无法将 formData 发送到我的 PHP 脚本。
我以前使用过相同的代码并成功。
这里是 HTML:
<form role="form" id="uploadForm" name="uploadForm" action="index.php" enctype="multipart/form-data" method="post">
<input type="file" id="file" name="file" />
<button type="button" id="uploadSubmit" class="btn btn-sm btn-flat btn-primary uploadSubmit">Upload Proforma</button>
</form>
这里是JavaScript
$('#uploadSubmit').on('click', function(e){
e.preventDefault();
var formData = new FormData();
formData.append("file", document.getElementById('file').files[0]);
$.ajax({
url: 'api/uploadDoc.php',
method: "POST",
data: formData,
contentType: false,
cache: false,
processData: false,
success: function(data){
console.log(data);
},
error: function(jqHHR, textStatus, errorThrown){
console.log('fail: ' + errorThrown);
}
});
return false;
});
这是 PHP uploadDoc.php 脚本:
<?php
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST');
header("Access-Control-Allow-Headers: X-Requested-With");
print_r($_POST);
?>
我刚刚在 PHP 脚本中添加了 headers,如下所示:
使用 print_r($_POST),我在控制台中只得到一个空白数组,如下所示:
Array
(
)
不确定我做错了什么。
为什么post显示的是空白数组和文件信息或formData?
如何更正此问题以便 PHP 脚本可以检索我正在上传的文件?
您需要使用变量 $_FILES
而不是 $_POST
来获取文件
您可以使用is_uploaded_file. But if you want to retrieve the file contents, simply you can use readfile确认上传文件如下:
if (!is_uploaded_file($_FILES['file']['tmp_name'])) {
die("Possible file upload attack: filename '". $_FILES['file']['tmp_name'] . "'.");
}
echo "File ". $_FILES['file']['name'] ." uploaded successfully.\n";
echo "Displaying contents\n";
readfile($_FILES['file']['tmp_name']);
我在这里找到了答案:
jQuery AJAX file upload PHP
我将我的 onClick 事件更新为如下内容:
$('#uploadProformaSubmit').on('click', function(e){
e.preventDefault();
var file_data = $('#file').prop('files')[0]; // <-- added this
var form_data = new FormData();
form_data.append('file', file_data);
$.ajax({
url: 'api/uploadDoc.php',
method: "POST",
type: "post", // <-- added this
data: formData,
contentType: false,
cache: false,
processData: false,
success: function(data){
console.log(data);
},
error: function(jqHHR, textStatus, errorThrown){
console.log('fail: ' + errorThrown);
}
});
return false;
});
在 PHP 脚本中,我可以执行以下操作:
<?php
if(isset($_FILES['file'])){
$file = $_FILES['file']['tmp_name'];
$handle = fopen($file, "r");
$i = 0;
echo "this is the file " . $file;
?>
现在正在发布文件。
可能是因为该站点使用的是旧版本的 JQuery (1.8.2.min.js),但我不能确定。
不确定为什么我无法将 formData 发送到我的 PHP 脚本。
我以前使用过相同的代码并成功。
这里是 HTML:
<form role="form" id="uploadForm" name="uploadForm" action="index.php" enctype="multipart/form-data" method="post">
<input type="file" id="file" name="file" />
<button type="button" id="uploadSubmit" class="btn btn-sm btn-flat btn-primary uploadSubmit">Upload Proforma</button>
</form>
这里是JavaScript
$('#uploadSubmit').on('click', function(e){
e.preventDefault();
var formData = new FormData();
formData.append("file", document.getElementById('file').files[0]);
$.ajax({
url: 'api/uploadDoc.php',
method: "POST",
data: formData,
contentType: false,
cache: false,
processData: false,
success: function(data){
console.log(data);
},
error: function(jqHHR, textStatus, errorThrown){
console.log('fail: ' + errorThrown);
}
});
return false;
});
这是 PHP uploadDoc.php 脚本:
<?php
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST');
header("Access-Control-Allow-Headers: X-Requested-With");
print_r($_POST);
?>
我刚刚在 PHP 脚本中添加了 headers,如下所示:
使用 print_r($_POST),我在控制台中只得到一个空白数组,如下所示:
Array
(
)
不确定我做错了什么。
为什么post显示的是空白数组和文件信息或formData?
如何更正此问题以便 PHP 脚本可以检索我正在上传的文件?
您需要使用变量 $_FILES
而不是 $_POST
您可以使用is_uploaded_file. But if you want to retrieve the file contents, simply you can use readfile确认上传文件如下:
if (!is_uploaded_file($_FILES['file']['tmp_name'])) {
die("Possible file upload attack: filename '". $_FILES['file']['tmp_name'] . "'.");
}
echo "File ". $_FILES['file']['name'] ." uploaded successfully.\n";
echo "Displaying contents\n";
readfile($_FILES['file']['tmp_name']);
我在这里找到了答案:
jQuery AJAX file upload PHP
我将我的 onClick 事件更新为如下内容:
$('#uploadProformaSubmit').on('click', function(e){
e.preventDefault();
var file_data = $('#file').prop('files')[0]; // <-- added this
var form_data = new FormData();
form_data.append('file', file_data);
$.ajax({
url: 'api/uploadDoc.php',
method: "POST",
type: "post", // <-- added this
data: formData,
contentType: false,
cache: false,
processData: false,
success: function(data){
console.log(data);
},
error: function(jqHHR, textStatus, errorThrown){
console.log('fail: ' + errorThrown);
}
});
return false;
});
在 PHP 脚本中,我可以执行以下操作:
<?php
if(isset($_FILES['file'])){
$file = $_FILES['file']['tmp_name'];
$handle = fopen($file, "r");
$i = 0;
echo "this is the file " . $file;
?>
现在正在发布文件。
可能是因为该站点使用的是旧版本的 JQuery (1.8.2.min.js),但我不能确定。