【发布时间】:2020-12-15 23:59:09
【问题描述】:
我正在尝试使用 javascript 将文件上传到远程服务器,并使用 PHP 作为后端。 javascript 工作正常,但在 PHP 端 $_FILES 和 $_POST 是空白的。但是,$_SERVER 确实显示了很多数据。我正在尝试将文件移动到用户目录,但找不到它的临时路径。我该怎么做?
PHP
<?php
print_r($_FILES); // empty array
print_r($_POST); // empty array
echo "Name: " . $_SERVER['HTTP_X_FILE_NAME'] . "<br />"; // shows file name
echo "Type: " . $_SERVER['HTTP_X_FILE_TYPE'] . "<br />"; // shows file type
echo "File: " . $_FILES['file1']['tmp_name'] . "<br />"; // throws array
print_r($_SERVER);
?>
Notice: Undefined index: file1 in /*/*/upload.php on line 11
Notice: Trying to access array offset on value of type null in /*/*/upload.php on line 11
print_r($_SERVER);
Array
(
[HTTP_HOST] => *.com
[CONTENT_LENGTH] => 236881
[HTTP_DNT] => 1
[HTTP_X_FILE_TYPE] => image/jpeg
[HTTP_X_FILE_NAME] => Image00001.jpg
[HTTP_USER_AGENT] => Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36
[CONTENT_TYPE] => image/jpeg
[HTTP_ACCEPT] => */*
[HTTP_ORIGIN] => *.com
[HTTP_REFERER] => *.com
[HTTP_ACCEPT_ENCODING] => gzip, deflate
[HTTP_ACCEPT_LANGUAGE] => en-US,en;q=0.9,kn;q=0.8
[HTTP_COOKIE] =>
[PATH] => /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
[SERVER_SIGNATURE] =>
[SERVER_SOFTWARE] => Apache
[SERVER_NAME] => *.com
[SERVER_ADDR] => *
[SERVER_PORT] => 80
[REMOTE_ADDR] => *
[DOCUMENT_ROOT] => */public_html
[REQUEST_SCHEME] => http
[CONTEXT_PREFIX] =>
[CONTEXT_DOCUMENT_ROOT] => */public_html
[SERVER_ADMIN] => webmaster@localhost
[SCRIPT_FILENAME] => */upload.php
[REMOTE_PORT] => 17770
[GATEWAY_INTERFACE] => CGI/1.1
[SERVER_PROTOCOL] => HTTP/1.1
[REQUEST_METHOD] => POST
[QUERY_STRING] =>
[REQUEST_URI] => */upload.php
[SCRIPT_NAME] => */upload.php
[PHP_SELF] => */upload.php
[REQUEST_TIME_FLOAT] => 1598508354.225
[REQUEST_TIME] => 1598508354
)
<form id="upload_form">
<input type="file" name="file1" id="file1"><br>
<input type="button" value="Upload File" onclick="uploadFile()">
<progress id="progressBar" value="0" max="100" style="width:300px;"></progress>
<pre id="status"></pre>
<p id="loaded_n_total"></p>
</form>
function uploadFile(){
var file = _("file1").files[0];
var ajax = new XMLHttpRequest();
ajax.open("POST", "upload.php",true);
ajax.setRequestHeader("X-File-Type", file.type);
ajax.setRequestHeader("X-File-Name", file.name);
ajax.send(file);
console.log(ajax.response);
}
【问题讨论】:
-
您的表单有错误的(无)encType
-
@LarsStegelitz 我改成
enctype="multipart/form-data"结果还是一样... -
仍在尝试不惜一切代价避免使用 FormData? stackoverflow.com/a/63591720/1427878 那你至少得自己设置必要的请求头,我想,我怀疑 XMLHttpRequest 会自己添加这些。
-
你真的还在努力支持IE9吗??
-
另外,当您执行
ajax.send(file);时,我什至看不到文件应该使用什么参数名发送到此处。您已经发送了那些 X-File-Something 标头,我猜是有原因的 - 但我怀疑 PHP 在解析请求时会关心这些。
标签: javascript php html ajax upload