2011-08-23 133 views
0

我有一個表單,其中包含文本字段& 2個文件上傳字段。表單數據應該使用ajax發送到一個電子郵件地址。但是,通過我的代碼,只有文本字段正在發送,而文件被省略。使用ajax發送文件

爲了解決這個問題,我使用「valums-file-uploader」將文件上傳到服務器上的目錄,試圖獲取文件鏈接並將它們與表單一起發送(而不是附加到電子郵件中,我最初努力實現)。

現在的問題是:文件正在上傳到服務器上的指定目錄,但我無法通過電子郵件發送鏈接。

這裏是我的代碼: 「demo.htm」

<!DOCTYPE html> 
<html> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
    <link href="fileuploader.css" rel="stylesheet" type="text/css"> 
    <style>  
     body {font-size:13px; font-family:arial, sans-serif; width:700px; margin:100px auto;} 

    </style>  
</head> 
<body>  




<p><a href="http://github.com/valums/file-uploader">Back to project page</a></p> 


<p>To upload a file, click on the button below. Drag-and-drop is supported in FF, Chrome.</p> 
<p>Progress-bar is supported in FF3.6+, Chrome6+, Safari4+</p> 

<div id="file-uploader-demo1">  
    <noscript>   
     <p>Please enable JavaScript to use file uploader.</p> 
     <!-- or put a simple form for upload here --> 
    </noscript>   
</div> 
<div id="uploaderFile"></div> 

<script src="fileuploader.js" type="text/javascript"></script> 
<script>   
    function createUploader(){    
     var uploader = new qq.FileUploader({ 
      element: document.getElementById('file-uploader-demo1'), 
      action: 'php.php', 
      debug: true, 
      onComplete: function(id, fileName, responseJSON){ 
          alert(responseJSON["filename"]); 
         } 
     }); 
    } 

    // in your app create uploader as soon as the DOM is ready 
    // don't wait for the window to load 
    window.onload = createUploader;  
</script>  
</body> 
</html> 

「php.php」

<?php 

/** 
* Handle file uploads via XMLHttpRequest 
*/ 

class qqUploadedFileXhr { 

/** 
* Save the file to the specified path 
* @return boolean TRUE on success 
*/ 

function save($path) {  
    $input = fopen("php://input", "r"); 
    $temp = tmpfile(); 
    $realSize = stream_copy_to_stream($input, $temp); 
    fclose($input); 

    if ($realSize != $this->getSize()){    
     return false; 
    } 

    $target = fopen($path, "w");   
    fseek($temp, 0, SEEK_SET); 
    stream_copy_to_stream($temp, $target); 
    fclose($target); 

    return true; 
} 
function getName() { 
    return $_GET['qqfile']; 
} 
function getSize() { 
    if (isset($_SERVER["CONTENT_LENGTH"])){ 
     return (int)$_SERVER["CONTENT_LENGTH"];    
    } else { 
     throw new Exception('Getting content length is not supported.'); 
    }  
} 
} 


/** 
* Handle file uploads via regular form post (uses the $_FILES array) 
*/ 

class qqUploadedFileForm { 
/** 
* Save the file to the specified path 
* @return boolean TRUE on success 
*/ 

function save($path) { 
    if(!move_uploaded_file($_FILES['qqfile']['tmp_name'], $path)){ 
     return false; 
    } 
    return true; 
} 
function getName() { 
    return $_FILES['qqfile']['name']; 
} 
function getSize() { 
    return $_FILES['qqfile']['size']; 
} 
} 

class qqFileUploader { 
    private $allowedExtensions = array(); 
    private $sizeLimit = 10485760; 
    private $file; 

function __construct(array $allowedExtensions = array(), $sizeLimit = 10485760){   
    $allowedExtensions = array_map("strtolower", $allowedExtensions); 

    $this->allowedExtensions = $allowedExtensions;   
    $this->sizeLimit = $sizeLimit; 

    //$this->checkServerSettings();  


    if (isset($_GET['qqfile'])) { 
     $this->file = new qqUploadedFileXhr(); 
    } elseif (isset($_FILES['qqfile'])) { 
     $this->file = new qqUploadedFileForm(); 
    } else { 
     $this->file = false; 
    } 
} 

private function checkServerSettings(){   
    $postSize = $this->toBytes(ini_get('post_max_size')); 
    $uploadSize = $this->toBytes(ini_get('upload_max_filesize'));   

    if ($postSize < $this->sizeLimit || $uploadSize < $this->sizeLimit){ 
     $size = max(1, $this->sizeLimit/1024/1024) . 'M';    
     die("{'error':'increase post_max_size and upload_max_filesize to $size'}");  
    }   
} 

private function toBytes($str){ 
    $val = trim($str); 
    $last = strtolower($str[strlen($str)-1]); 
    switch($last) { 
     case 'g': $val *= 1024; 
     case 'm': $val *= 1024; 
     case 'k': $val *= 1024;   
    } 
    return $val; 
} 


/** 
* Returns array('success'=>true) or array('error'=>'error message') 
*/ 

function handleUpload($uploadDirectory, $replaceOldFile = FALSE){ 
    if (!is_writable($uploadDirectory)){ 
     return array('error' => "Server error. Upload directory isn't writable."); 
    } 

    if (!$this->file){ 
     return array('error' => 'No files were uploaded.'); 
    } 

    $size = $this->file->getSize(); 

    if ($size == 0) { 
     return array('error' => 'File is empty'); 
    } 

    if ($size > $this->sizeLimit) { 
     return array('error' => 'File is too large'); 
    } 

    $pathinfo = pathinfo($this->file->getName()); 
    $filename = $pathinfo['filename']; 
    //$filename = md5(uniqid()); 
    $ext = $pathinfo['extension']; 

    if($this->allowedExtensions && !in_array(strtolower($ext), $this->allowedExtensions)){ 
     $these = implode(', ', $this->allowedExtensions); 
     return array('error' => 'File has an invalid extension, it should be one of '. $these . '.'); 
    } 

    if(!$replaceOldFile){ 
     /// don't overwrite previous files that were uploaded 
     while (file_exists($uploadDirectory . $filename . '.' . $ext)) { 

      $filename .= '_'.rand(10, 999); 
     } 
    } 

    if ($this->file->save($uploadDirectory . $filename . '.' . $ext)){ 

     //return array('success'=>true); 

     return array('success'=>true, 'filename'=>$uploadDirectory . $filename . '.' . $ext); 
     mail('[email protected]', 'File Link', $uploadDirectory . $filename . '.' . $ext, '[email protected]'); 
    } else { 
     return array('error'=> 'Could not save uploaded file.' . 
      'The upload was cancelled, or server error encountered'); 
    }   
}  
} 

// list of valid extensions, ex. array("jpeg", "xml", "bmp") 

$allowedExtensions = array(); 

// max file size in bytes 

$sizeLimit = 10 * 1024 * 1024; 

$uploader = new qqFileUploader($allowedExtensions, $sizeLimit); 
$result = $uploader->handleUpload('uploads/'); 

// to pass data through iframe you will need to encode all html tags 

echo htmlspecialchars(json_encode($result), ENT_NOQUOTES); 

回答

0

您正在嘗試使用mail後您從handleUpload返回一個值。這樣的return之後的任何代碼都無法訪問,並且不會執行。