【问题标题】:Add Input of Type File to a Form Dynamically将类型文件的输入动态添加到表单中
【发布时间】:2013-03-11 05:36:19
【问题描述】:

我正在开发拖放功能。我有代码需要在文件拖放到我的放置区域时捕获文件,但是由于无法通过 jQuery 或 ajax 发送文件,因此在将其发送给 xmlhttprequest 时遇到了一些问题。

我现在正在考虑一个隐藏的 iFrame,但我真的不知道如何将这个文件附加到一个现有的表单中,这要归功于用户 drop。

var droparea = $('#dropzone');
    var uploadButon = $('#upload');
    droparea.on('dragover',function(){
        $(this).addClass('dragover');
        return false;
    });
    droparea.on('dragleave',function(){
        $(this).removeClass('dragover');
        return false;
    });
    droparea.on('drop', function(e) {
       e.stopPropagation();
       e.preventDefault();
       $(this).removeClass('dragover');
       var files = e.originalEvent.dataTransfer.files;

       var formData = new FormData($("form")[0]);

            for( var i = 0; i < files.length; ++i ) {
                var file = files[i];
                formData.append("files[]", file);
            }

            return $.ajax({
                url: "upload.php",
                type: "POST",
                data: formData,
                processData: false,
                contentType: false,
                success: function(text) {
                    alert(text);
                }

            });

    });

            //the php

           <?php
             echo count($_FILES["files"]);
                for($i = 0; $i < count($_FILES["files"]["name"]) ; $i++)
                {
              if(move_uploaded_file($_FILES["files"]["tmp_name"][$i],                               "upload/".$_FILES["files"]["name"][$i]))
                echo "ok";
                   else
                echo "no";
                 }
            ?>

【问题讨论】:

  • 这应该可以,假设$('userDropedFile') 的目标是文件输入。但是,如果您使用拖放文件上传,为什么不更进一步,也实现 xhr 文件上传,而不是使用 iframe(如果可用)?
  • 为什么文件输入一开始不在表单里面?
  • 编辑,现在工作正常!

标签: jquery ajax forms file upload


【解决方案1】:
var myFile = $('userDropedFile');

不是一个有效的 jQuery 选择器。你的意思是:

var myFile = $('#userDropedFile');

【讨论】:

    【解决方案2】:

    我认为你的意思是元素

    $("#userDroppedFile")
    

    是你的放置区。

    这不是你获取文件的方式,你可以在 drop 事件中获取它:

    $("#userDroppedFile").on("drag dragend dragenter dragleave dragover dragstart drop", function(e){
        var files;
        e.preventDefault();
    
        if( e.type === "drop" && e.originalEvent.dataTransfer ) {
            files = e.originalEvent.dataTransfer.files;
        }
    
        if( !files || !files.length ) {
            return;
        }
    
        doUpload(files);
    
    });
    

    在 doUpload 中获取form data from your static html form,并将文件添加到其中并上传:

    function doUpload(files) {
    
        var formData = new FormData($("form")[0]);
    
        for( var i = 0; i < files.length; ++i ) {
            var file = files[i];
            formData.append("file" + (i+1), file);
        }
    
        return $.ajax({
            url: "xx",
            type: "POST",
            data: formData,
            processData: false,
            contentType: false,
            success: function() {
            }
    
        });
    }
    

    【讨论】:

    • 不,我试图简单地缩小我的放置区域,但我正在捕捉文件,如果你想要我不能发布所有代码,但假设我已经有了文件,我该如何附加它以一种形式。感谢您的快速答复,我试试!
    • @SantiagoNicolasRoca 我正在展示如何将其附加到doUpload 函数中的表单中。您无法将文件附加到普通表单,遗憾的是只能使用 ajax 上传。跨度>
    • 那更好,我已经尝试过了,上传文件的 php 仍然收到一个空的 $_FILES
    • @SantiagoNicolasRoca 使用 file.name 作为文件输入键可能会出现问题。我将编辑一个可能的修复,除了我不知道没有任何调试信息。
    • @iPadDeveloper2011 使用 processData: falsecontentType: false
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-24
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 2016-02-22
    • 1970-01-01
    相关资源
    最近更新 更多