使用jQuery和PHP进行多文件上传。创建最简化的示例

时间:2012-08-27 05:56:55

标签: php jquery html5 file-upload

我想使用jQuery创建一个多文件文件上传器。

以下是我正在使用的代码。我只是想使用jQuery(和File API)和PHP一次性提取上传多个文件的要点。如果有人有简化的答案,请随时分享或提供建议。

现在,此代码可用于上传图像(有点)。有问题:

  1. 即使选择了多个文件,也只有一个文件上传到目录
  2. 表单会在提交时更改页面
  3. 这是我正在使用的js / jquery:

    function html5Upload($form) {
        file = $form.data('input');
        if (file) {
            var fd = new FormData();
            fd.append($form.find(selector).attr('name'), file);
            //get other form input and append to formData
            $form.find(':input').each(function () {
                if (this.type != 'file') {
                    fd.append($(this).attr('name'), $(this).val());
                }
            });
    
            //Upload using jQuery AJAX
            jqxhr = $.ajax({
                url: $form.attr('action'),
                data: fd,
                cache: false,
                contentType: false,
                processData: false,
                type: 'POST',
                success: function () {
                    alert("Images Uploaded!");
                }
            });
        }
    
        $form.remove();
    }
    
    
    $('form').submit(function (event) {
        event.preventDefault();
        html5Upload($('form.mupload'));
        return false;
    });
    

    HTML

    <form class="mupload" action="upload.php" method="post" enctype="multipart/form-data">
        <input type="file" name="userfile" class="fileUpload" multiple>
    
        <button type="submit">Upload</button>
    </form>
    

    PHP

    /*
    Easy PHP Upload - version 2.32
    A easy to use class for your (multiple) file uploads
    
    Copyright (c) 2004 - 2010, Olaf Lederer
    */
    include("easy_upload/upload_class.php");
    
    $upload = new file_upload();
    
    $upload->upload_dir = 'uploads/';
    $upload->extensions = array('.png', '.jpg', '.zip', '.pdf'); // specify the allowed extensions here
    $upload->rename_file = true;
    
    
    if(!empty($_FILES)) {
        $upload->the_temp_file = $_FILES['userfile']['tmp_name'];
        $upload->the_file = $_FILES['userfile']['name'];
        $upload->http_error = $_FILES['userfile']['error'];
        $upload->do_filename_check = 'y'; // use this boolean to check for a valid filename
        if ($upload->upload()){
    
            echo '<div id="status">success</div>';
            echo '<div id="message">'. $upload->file_copy .' Successfully Uploaded</div>';
            //return the upload file
            echo '<div id="uploadedfile">'. $upload->file_copy .'</div>';
    
        } else {
    
            echo '<div id="status">failed</div>';
            echo '<div id="message">'. $upload->show_error_string() .'</div>';
    
        }
    }
    

1 个答案:

答案 0 :(得分:1)

到目前为止,我已经看到了一些潜在的问题:

  1. 仅上传了一个文件。

    • 对于多文件上传,我认为文件输入的name属性应该类似于userfiles[]。这样就不会被覆盖。仅供参考:如果两个HTML输入具有相同的名称而没有[],则只会通过请求发送后者。 []也可用于发送具有多个值的任何数据,例如select(想想数组,它在$ _POST中表示为数组)。
    • 我真的不知道你的上传处理程序,你确定它可以处理多个文件上传吗?
  2. 我猜您在form之前添加了脚本标记?尝试将事件代码放在jQuery domReady中,如此

  3. $(function() {
         $('form').submit(function (event) {
            event.preventDefault();
            html5Upload($('form.mupload'));
            return false;
        });
    });
    

    您可能希望先检查此问题。