使用ajax发送文件

问题描述 投票:0回答:1

我有一个包含文本字段和 2 个文件上传字段的表单。表单数据应使用 ajax 发送到电子邮件地址。但是,使用我的代码,仅发送文本字段,而忽略文件。

为了解决这个问题,我使用了“valums-file-uploader”,将文件上传到服务器上的目录,试图获取文件链接并将它们与表单一起发送(而不是附加它们)到电子邮件,这是我最初努力实现的)。

现在的问题是:文件正在上传到服务器上的指定目录,但我无法通过电子邮件发送它们的链接。

这是我的代码: “演示.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);
php jquery file-upload
1个回答
0
投票

您正在尝试使用

mail
after
handleUpload
返回一个值。像这样的
return
后面的任何代码都是无法访问的,并且不会被执行。

© www.soinside.com 2019 - 2024. All rights reserved.