jquery ajax单个文件上传

这个问题在这里已经有了答案:

  • 我怎样才能异步上传文件? 27个答案

  • 经过几个小时的搜索和寻找答案,最后我做到了!!!!! 代码在下面:))))

    HTML:

    <form id="fileinfo" enctype="multipart/form-data" method="post" name="fileinfo">
        <label>File to stash:</label>
        <input type="file" name="file" required />
    </form>
    <input type="button" value="Stash the file!"></input>
    <div id="output"></div>
    

    jQuery的:

    $(function(){
        $('#uploadBTN').on('click', function(){ 
            var fd = new FormData($("#fileinfo"));
            //fd.append("CustomField", "This is some extra data");
            $.ajax({
                url: 'upload.php',  
                type: 'POST',
                data: fd,
                success:function(data){
                    $('#output').html(data);
                },
                cache: false,
                contentType: false,
                processData: false
            });
        });
    });
    

    upload.php文件中,您可以访问使用$_FILES['file']传递的数据。

    感谢大家试图帮助:)

    我从这里(有一些变化)采取了答案MDN


    A.从文件字段抓取文件数据

    要做的第一件事是将函数绑定到文件字段上的change事件和用于获取文件数据的函数:

    // Variable to store your files
    var files;
    
    // Add events
    $('input[type=file]').on('change', prepareUpload);
    
    // Grab the files and set them to our variable
    function prepareUpload(event)
    {
      files = event.target.files;
    }
    

    这将文件数据保存到文件变量以供以后使用。

    B.提交时处理文件上传

    提交表单时,您需要在自己的AJAX请求中处理文件上传。 添加以下绑定和功能:

    $('form').on('submit', uploadFiles);
    
    // Catch the form submit and upload the files
    function uploadFiles(event)
    {
      event.stopPropagation(); // Stop stuff happening
        event.preventDefault(); // Totally stop stuff happening
    
    // START A LOADING SPINNER HERE
    
    // Create a formdata object and add the files
    var data = new FormData();
    $.each(files, function(key, value)
    {
        data.append(key, value);
    });
    
    $.ajax({
        url: 'submit.php?files',
        type: 'POST',
        data: data,
        cache: false,
        dataType: 'json',
        processData: false, // Don't process the files
        contentType: false, // Set content type to false as jQuery will tell the server its a query string request
        success: function(data, textStatus, jqXHR)
        {
            if(typeof data.error === 'undefined')
            {
                // Success so call function to process the form
                submitForm(event, data);
            }
            else
            {
                // Handle errors here
                console.log('ERRORS: ' + data.error);
            }
        },
        error: function(jqXHR, textStatus, errorThrown)
        {
            // Handle errors here
            console.log('ERRORS: ' + textStatus);
            // STOP LOADING SPINNER
        }
    });
    }
    

    这个函数做的是创建一个新的formData对象并将每个文件附加到它。 然后它将该数据作为请求传递给服务器。 2个属性需要设置为false:

  • processData - 因为jQuery会将文件数组转换为字符串,并且服务器无法将其提取出来。
  • contentType - 将其设置为false,因为jQuery默认为application / x-www-form-urlencoded并且不发送文件。 同样将它设置为multipart / form-data似乎也不起作用。
  • C.上传文件

    快速和肮脏的PHP脚本上传文件并传回一些信息:

    <?php // You need to add server side validation and better error handling here
    
    $data = array();
    
    if(isset($_GET['files']))
    {  
    $error = false;
    $files = array();
    
    $uploaddir = './uploads/';
    foreach($_FILES as $file)
    {
        if(move_uploaded_file($file['tmp_name'], $uploaddir .basename($file['name'])))
        {
            $files[] = $uploaddir .$file['name'];
        }
        else
        {
            $error = true;
        }
    }
    $data = ($error) ? array('error' => 'There was an error uploading your files') : array('files' => $files);
    }
    else
    {
        $data = array('success' => 'Form was submitted', 'formData' => $_POST);
    }
    
    echo json_encode($data);
    
    ?>
    

    IMP:不要使用这个,写你自己的。

    D.处理表单提交

    上传功能的成功方法将从服务器发回的数据传递给提交功能。 然后您可以将其作为您的帖子的一部分传递给服务器:

    function submitForm(event, data)
    {
      // Create a jQuery object from the form
    $form = $(event.target);
    
    // Serialize the form data
    var formData = $form.serialize();
    
    // You should sterilise the file names
    $.each(data.files, function(key, value)
    {
        formData = formData + '&filenames[]=' + value;
    });
    
    $.ajax({
        url: 'submit.php',
        type: 'POST',
        data: formData,
        cache: false,
        dataType: 'json',
        success: function(data, textStatus, jqXHR)
        {
            if(typeof data.error === 'undefined')
            {
                // Success so call function to process the form
                console.log('SUCCESS: ' + data.success);
            }
            else
            {
                // Handle errors here
                console.log('ERRORS: ' + data.error);
            }
        },
        error: function(jqXHR, textStatus, errorThrown)
        {
            // Handle errors here
            console.log('ERRORS: ' + textStatus);
        },
        complete: function()
        {
            // STOP LOADING SPINNER
        }
    });
    }
    

    最后说明

    这个脚本仅仅是一个例子,你需要处理服务器端和客户端验证,并以某种方式通知用户文件上传正在进行。 如果你想看到它的工作,我在Github上为它做了一个项目。

    参考来源

    链接地址: http://www.djcxy.com/p/19599.html

    上一篇: Jquery ajax single file upload

    下一篇: Preview an image before it is uploaded