찾다

 >  Q&A  >  본문

javascript - ajax结合html5中的file实现文件上传,后台用PHP接收,该如何用PHP接收传过来的formData?

如何用PHP接收前端传输过来的文件,formdata这个对象的文件到是什么类型的二进制的数据吗?
前端代码:

<input type="file" name="file" id="file" multiple>
<script type="text/javascript">
    var file = document.querySelector("#file");
    file.onchange = function(){
        var files = this.files;
        for(var i=0;i<files.length;i++){
            ajax('ajax.php',files[i],function(data){
                console.log(data)
                console.log('fn')
            })
        }
    }
    function ajax(url,data,fn){
        var xhr = new XMLHttpRequest();
        xhr.onreadystatechange = function(){
            if(xhr.readyState==4&&xhr.status==200){
                fn(xhr.responseText)
            }
        }
        var formData = new FormData();
        formData.append('file',data);
        xhr.open('POST',url,true);
        //xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
        xhr.send(formData);
    }
</script>

php代码:

<?php
if(!empty($_FILES['file'])){
    $fileinfo = $_FILES['file'];
    $destination = "image/";
    $destination = $destination.basename($_FILES['file']['name']);
    move_uploaded_file($fileinfo['tmp_name'],$destination);
    echo "succ";
}
?>

不知道为什么if(!empty($_FILES['file']))这判断一直false,改用if(!empty($_POST['file']))也是一样;哪位知道后台是如何接收传过来的文件的吗?可不可以给个demo的PHP文件!

迷茫迷茫2813일 전1078

모든 응답(6)나는 대답할 것이다

  • 阿神

    阿神2017-04-11 12:01:08

    我在php中加了3个日志记录:

    file_put_contents('/tmp/tmp.log', '$_FILES'.":\n".print_r($_FILES, true)."\n\n", FILE_APPEND);
    file_put_contents('/tmp/tmp.log', '$_POST'.":\n".print_r($_POST, true)."\n\n", FILE_APPEND);
    file_put_contents('/tmp/tmp.log', '$_SERVER'.":\n".print_r($_SERVER, true)."\n\n", FILE_APPEND);

    存储路径改成tmp了,其他没变,得到的结果:

    [root@localhost tmp]# cat tmp.log 
    $_FILES:
    Array
    (
        [file] => Array
            (
                [name] => Screenshot_2010-01-01-08-11-30.png
                [type] => image/png
                [tmp_name] => /tmp/phposvIcw
                [error] => 0
                [size] => 30920
            )
    
    )
    
    
    $_POST:
    Array
    (
    )
    
    
    $_SERVER:
    Array
    (
        [USER] => nginx
        [HOME] => /var/lib/nginx
        [FCGI_ROLE] => RESPONDER
        [SCRIPT_FILENAME] => /var/www/test.php
        [SCRIPT_NAME] => /test.php
        [PATH_INFO] => 
        [QUERY_STRING] => 
        [REQUEST_METHOD] => POST
        [CONTENT_TYPE] => multipart/form-data; boundary=----WebKitFormBoundaryiJpJZSxazdqa8hzb
        [CONTENT_LENGTH] => 31127
        [REQUEST_URI] => /test.php
        [DOCUMENT_URI] => /test.php
        [DOCUMENT_ROOT] => /var/www
        [SERVER_PROTOCOL] => HTTP/1.1
        [GATEWAY_INTERFACE] => CGI/1.1
        [SERVER_SOFTWARE] => nginx/1.6.3
        [REMOTE_ADDR] => 192.168.255.1
        [REMOTE_PORT] => 60032
        [SERVER_ADDR] => 192.168.255.128
        [SERVER_PORT] => 80
        [SERVER_NAME] => 
        [REDIRECT_STATUS] => 200
        [HTTP_HOST] => 192.168.255.128
        [HTTP_CONNECTION] => keep-alive
        [HTTP_CONTENT_LENGTH] => 31127
        [HTTP_ORIGIN] => http://192.168.255.128
        [HTTP_USER_AGENT] => Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36
        [HTTP_CONTENT_TYPE] => multipart/form-data; boundary=----WebKitFormBoundaryiJpJZSxazdqa8hzb
        [HTTP_ACCEPT] => */*
        [HTTP_DNT] => 1
        [HTTP_REFERER] => http://192.168.255.128/test.html
        [HTTP_ACCEPT_ENCODING] => gzip, deflate
        [HTTP_ACCEPT_LANGUAGE] => zh-CN,zh;q=0.8,ja;q=0.6,en;q=0.4
        [PHP_SELF] => /test.php
        [REQUEST_TIME_FLOAT] => 1470377177.1168
        [REQUEST_TIME] => 1470377177
    )
    
    

    文件成功上传

    [root@localhost tmp]# ll
    total 36
    -rw-r--r-- 1 nginx nginx 30920 Aug  5 14:06 Screenshot_2010-01-01-08-11-30.png
    -rw-r--r-- 1 nginx nginx  1705 Aug  5 14:06 tmp.log
    [root@localhost tmp]# 

    没有出错……

    회신하다
    0
  • PHP中文网

    PHP中文网2017-04-11 12:01:08

    先来个打印看看啊!先别用if判断。直接

    echo 'FILES:'.var_dump($_FILES);
    echo 'POST:'.var_dump($_POST);
    die();

    看看是什么东东。然后在一步一步的来

    회신하다
    0
  • 高洛峰

    高洛峰2017-04-11 12:01:08

    F12看请求啊

    회신하다
    0
  • 迷茫

    迷茫2017-04-11 12:01:08

    楼主用$_REQUES接收试一下吧。

    회신하다
    0
  • PHP中文网

    PHP中文网2017-04-11 12:01:08

    打开chrome的控制台看看请求Request发送了什么,主要看请求头的Content-Type和请求体

    회신하다
    0
  • 大家讲道理

    大家讲道理2017-04-11 12:01:08

    请问一下,我前台以jquery的FormData提交数据,后台也接不到数据,打印post是这样的
    array(1) {
    ["------WebKitFormBoundarygALiDzl13YUFBzpN
    Content-Disposition:_form-data;_name"] => string(334) ""member_id"

    3
    ------WebKitFormBoundarygALiDzl13YUFBzpN
    Content-Disposition: form-data; name="token"

    VjnAqgvEKKiC=i3SA2vLom=dfqHKm0Ew
    ------WebKitFormBoundarygALiDzl13YUFBzpN
    Content-Disposition: form-data; name="portrait"; filename=""
    Content-Type: application/octet-stream

    ------WebKitFormBoundarygALiDzl13YUFBzpN--
    "
    }

    회신하다
    0
  • 취소회신하다