2013-08-27 120 views
1

我一直在寻找上传文件。 AJAX使用FormData和FileReader,但我仍然遇到同样的问题。在PHP中通过文件上传缺少临时文件。 AJAX

一旦触发文件上传,它将被传递给一个验证上传文件并尝试将其移入永久目录的PHP脚本。不幸的是,虽然验证成功,调用move_uploaded_file()结果如下警告:

警告:move_uploaded_file([路径\到\ TEMP \目录] \ php256.tmp):未能 打开流:在没有这样的文件或目录 [路径/到/脚本/ file.php]上线[线路]

警告 :move_uploaded_file()以: 无法移动 '[路径\到\ temp \地址] \ php256.tmp' 至 '[路径\到\永久\目录] \ [FILENAME.EXT]' 在 [路径/要/script/file.php]上线 [线路]

经由通常提交表单和移动临时文件按预期工作上传文件。

我的php.ini设置是相当标准:

file_uploads = On 
upload_tmp_dir = "[path\to\temp\directory]" 
upload_max_filesize = 2M 
max_file_uploads = 20 

我的PHP也应该是相当标准:

$fileField = 'target_file'; 

if(!(isset($_FILES) && is_array($_FILES) && isset($_FILES[$fileField]))) { 
    // No File Sent (Error Out) 
} 

$file = $_FILES[$fileField]; 

// Errors in transfer? 
if(isset($file['error'])) { 

    $haltMessage = false; 

    switch($file['error']) { 
     /* Switchboard checking through all standard file upload errors. And, of course, ERR_OK */ 
    } 

    if($haltMessage !== false) { 

     // An error occured! Error Out 

    } 

} 

// Check if the file was uploaded. 
if(!is_uploaded_file($file['tmp_name'])) { 

    // No File Uploaded (Error Out) 

} 

if(/* File type checking.. */)) { 

    // Invalid file type (Error Out) 

} 

$uploadDir = 'path/to/permanent/dir'; 

$fileName = $file['name']; 

$location = $uploadDir . DS . basename($fileName); // DS = '/' 

$result = move_uploaded_file($file['tmp_name'], $location); 

if($result) { 

    // Yes! 

} else { 

    // Something did indeed go wrong. 
    // This block of code is ran after the warnings are issued. 


} 

这样离开我的JavaScript是有些期望:

(function($) { 


    $(document).ready(function(){ 

     var url = 'url/to/php/script.php', 
      input, 
      formdata; 

     // FormData support? (We have a fallback if not) 
     if(window.FormData != null && window.FileReader != null) { 

      input = document.getElementById('target_file'); 
      formdata = new FormData(), 

      input.addEventListener('change', function(ev) { 

       var reader, 
        file; 

       if(this.files.length === 1) { 

        file = this.files[0]; 

        if(!!file.type.match(/* File type matching */)) { 

         reader = new FileReader(); 
         reader.onloadend = function (e) { 

          // Uploaded Handle 

         } 

         reader.onload = function() { 

          formdata.append('target_file', file); 

          $.ajax({ 
           url : url, 
           type : "POST", 
           data : formdata, 
           processData: false, 
           contentType: false, 
           success : function(res) { 
            console.log(res); 
           } 
          }); 

         } 

         reader.readAsDataURL(file); 

        } else { 
         // Invalid file type. 
        } 

       } else { 
        // No file/too many files (hack) selected. 
       } 

      }, false); 

     } 
    }); 
}(jQuery)); 

我使用FireFox 23.0.1,并且在服务器上运行PHP 5.4.7。

对长期问题抱歉,但我不确定问题出现在哪里。转储$ _FILES变量会显示一个充满期望文件信息的数组,包括一个tmp_name。没有任何错误的迹象,只有当我试图移动临时文件。

任何帮助你可以给这个问题将不胜感激!

+0

你为什么在这里使用的FileReader呢?除非你真的想要例如读取每个文件的内容,否则完全没有必要和效率低下。如果您只是简单地上传文件,则无需阅读文件。事实上,在文件被读取之后,你甚至没有对文件内容做任何事情。 –

+0

我正在尝试一堆替代建议,比如事先将文件作为二进制文件读取。这是我能取得成功的最接近的解决方案。其他尝试和修补程序导致文件没有被传递到服务器。 至于没有对读取的文件内容做任何事情,另一个建议是通过内容而不仅仅是文件变量。这也导致了失败。 – Sean

+0

不需要使用FileReader,只需将从您的'抓取的'File'对象附加到'FormData'对象,并将'FormData'对象与您的ajax请求一起发送。 –

回答

0

Geht斯内德MIT JS ... Link:

move_uploaded_file() ist von den normalen Safe Mode UID-Einschränkungen nicht betroffen. Dies ist nicht unsicher, da move_uploaded_file() nur mit via **PHP hochgeladenen Dateien** arbeitet.