【问题标题】:Cannot access upload file in PHP无法在 PHP 中访问上传文件
【发布时间】: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


【解决方案1】:

文件上传通过内容类型multipart/form-data 进行。这就是 PHP $_FILEs 数组填充将被触发的原因。你必须在你的表单中设置它。

<form id="upload_form" method="post" enctype="multipart/form-data">

当通过 ajax 进行文件上传时,您必须设置 content-type 标头。

ajax.setRequestHeader("content-type", "multipart/form-data");

【讨论】:

  • 我这样做了,又试了一次,还是一样的……
  • 上传是通过 Ajax 进行的,所以它不会注意到属性
  • 知道文件当前上传到哪里吗?所以我可以使用move_uploaded_file()
  • 上传文件到系统临时目录。该位置取决于操作系统配置。
猜你喜欢
  • 2014-08-04
  • 1970-01-01
  • 2017-09-21
  • 1970-01-01
  • 2016-02-17
  • 1970-01-01
  • 1970-01-01
  • 2015-06-05
  • 2018-07-28
相关资源
最近更新 更多