【问题标题】:Ajax PHP file uploader won't workAjax PHP 文件上传器不起作用
【发布时间】:2015-02-21 14:38:34
【问题描述】:

我正在开发 ajax 图片上传器,当有人提交图片时它会自动工作

 rename("user_image/".$_FILES[uploaded][name].".png","user_image/".$_SESSION["id"].".png");

文件不会被上传并移动到指定的目录,但是当我删除它时,文件被上传了,我认为问题出在他可以编辑文件的权限上,文件权限是 644

这是我的 php 文件:

<?php
   if($_SERVER["REQUEST_METHOD"]=="POST"){
          $file = $_FILES["uploaded"];
          $target_dir = "user_image/";
          $target_file = $target_dir . basename($_FILES["uploaded"]["name"]);
          move_uploaded_file($_FILES["uploaded"]["tmp_name"],$target_file);
          rename('user_image/'.$_FILE["uploaded"]["name"].".gif",'user_image/'.$_SESSION["id"].".gif");
   }
?>

这是 html 和 ajax 的其余部分:

<!DOCTYPE html>
<html>
   <head>
      <title>Register</title>
      <link href='http://fonts.googleapis.com/css?family=Arvo:400,700|Ubuntu:300,400,500,700' rel='stylesheet' type='text/css'>
    <link rel="stylesheet" type="text/css" href="/css/style.css"/>
</head>
<body>
    <div id="container">
        <div id="half1">
            <div id="upload">
               <div id="user">
                   <img src="/img/1.png" id="one" alt="User image"/>
               </div>
              <img src="/img/plus.png" alt="Upload">
              <form method="post" enctype="multipart/form-data"> <input name="uploaded" type="file" id="file_upload"/> </form>
            </div>
        </div>
        <div id="half2">
            <h1>Sign up!</h1>
            <form action="register.php" method="post" >
                <input type="text" placeholder="Age" name="age">
                <input type="text" placeholder="Favourite dish" name="dish">
            </form>
        </div>
    </div>
    <p id="user_id" style="display:none;" ><?= $_SESSION["id"]; ?></p>
    <script charset="UTF-8">
        function _(id){
            return document.getElementById(id);
        }
        _("file_upload").onchange = function() {
            var id = _("user_id").innerHTML;
            var file = _("file_upload").files[0];
            var formdata = new FormData();
            formdata.append("uploaded",file);
            var ajax = new XMLHttpRequest();
            ajax.onreadystatechange =
            function(){
                if(ajax.readyState==4 && ajax.status==200){
                   _("one").remove();
                    var img = document.createElement('img');
                    var first_path = '/user_image/';
                    var path = first_path.concat(id,'.png');
                    img.setAttribute('alt','User image');
                    img.setAttribute('id','one');                        
                    img.setAttribute('src',path);
                    _("user").appendChild(img);  
                    alert("end");
                }    
                else{
                    _("one").remove();
                    var img = document.createElement('img');
                    img.setAttribute('src','/img/loading.gif');
                    img.setAttribute('alt','User image');
                    img.setAttribute('id','one');
                    _("user").appendChild(img);                        
                }
            }              
            ajax.open("POST","upload_image.php");
            ajax.setRequestHeader("Content-type", "multipart/form-data"); 
            ajax.send(formdata);
        };
    </script>
</body>

【问题讨论】:

  • 我总是读到你不能用 Ajax 传递文件,因为它的内容。可能我错了,但这是我在有人要求时读到的。
  • 上传的文件实际上是以临时文件名存储的。使用$_FILES['uploaded']['tmp_name']
  • Image upload ajax don't work 的可能重复项
  • 我在一小时前回答了 xhr 问题。您需要添加具体问题。您正在重复上传问题并在此线程中解决移动临时文件问题。请提出单独的问题。
  • 检查 file_uploads 的 php.ini 值。它应该设置为1。它可能被禁用,这可能会阻止用户上传文件。

标签: javascript php ajax upload xmlhttprequest


【解决方案1】:

你想rename 什么,你不能。 $_FILE['uploaded']['name'] 是客户端机器的原始文件名。所以你的服务器上不会有C:\tmp\abc.png这样的文件,什么意思,你不能重命名。

无论如何,这行重命名有什么意义?如果要重命名,请在move_uploaded_file 函数中进行。

【讨论】:

  • 即使我在 move_uploaded_file 上重命名文件也不会上传
【解决方案2】:

我认为您在重命名文件时不会提供图像文件的静态扩展名,并且在文件上传期间不会更改图像的扩展名。

【讨论】:

    【解决方案3】:

    内容类型标头需要设置为multipart/form-data。所以服务器知道它期待什么样的数据。

    这将在 Internet Explorer 中运行

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

    但是在 Firefox 或 Chrome 中添加它会导致 PHP 中的帖子数据丢失。

    现在服务器知道它可以期待一些复杂的表单数据,包括文件和 blob。

    【讨论】:

    • 我已经在标签encrypte="multipart/form-data"中指定了内容加密类型
    • Mouser 同样的问题仍然存在,即使我完全按照你说的做,请帮忙?
    • PHP 回馈什么(再次尝试var_dump)。您是否使用开发工具嗅探过您的帖子?什么被发送到服务器?
    • 我在发送的响应中收到一个错误,上传的是未定义的索引,但正如您在我的代码中看到的那样,我在输入标签中定义了 name 属性我应该怎么做请帮忙?
    • 您的浏览器是否通过dev tool 嗅探了请求? uploaded 是浏览器在 post 参数中发送的吗?
    猜你喜欢
    • 2018-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-17
    • 1970-01-01
    • 1970-01-01
    • 2015-02-11
    相关资源
    最近更新 更多