首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何允许独立的文件从表单中上传?

如何允许独立的文件从表单中上传?
EN

Stack Overflow用户
提问于 2022-06-09 13:57:42
回答 1查看 31关注 0票数 1

我正在构建一个支持联系人表单,用户可以上传文件。文件上传使用AJAX进行管理:用户可以上传文件,然后在方便的情况下提交表单。但是,当前的布局并不是美观的:上传输入在表单提交按钮下面。

我读过关于嵌套表单和新的form属性的文章,我认为这样做会奏效:

代码语言:javascript
复制
<form action="" method="post" enctype="multipart/form-data" id="main-form">
...
    <form action="/upload_file_ajax.php" method="post" id="file-upload-form">
    <div class="form-group row mb-3 mb-3">
        <label class="col-sm-3 col-lg-3 col-form-label" for="file"><?php echo $label['attach-file']; ?></label>
        <div class="col-sm-8 col-lg-7">
            <input class="form-control custom-file-input" name="file" id="file" type="file" form="file-upload-form" />
        </div>
    </div>
    </form>

    <div class="form-group row">
        <div class="col-4 offset-3">
            <button type="submit" name="submit" class="btn btn-outline-success" form="main-form"><?php echo $label['submit-button']; ?></button>
        </div>
    </div>

    </form>

我已经将form属性添加到每个输入和按钮中。但是,当我添加文件时,内部表单(“文件-上传-表单”)根本不会提交。

这可能是因为这是一个自动提交的输入,即Javascript在选择文件时触发AJAX吗?这是触发线:

代码语言:javascript
复制
$('#file-upload-form').on('change', function(e){
...

一旦我将嵌套表单移动到主窗体的关闭</form>标记下面,它就能工作了。

如果美学布局可以实现任何其他方式,例如,文件上传输入可以出现在提交按钮之上,而不嵌套表格,请告诉我。

编辑:这是修改后的Javascript,负责通过AJAX上传文件。我已经删除了建议的内部form标签,但输入仍然不会提交。

代码语言:javascript
复制
$(function(){
    // listen for input changes (when a file is selected)
    $('#file-upload-input').on('change', function(e){
        //var formData = new FormData();
        // file has been selected, submit it via ajax
        $.ajax({
            type: 'POST',
            url: "/upload_file_ajax.php",
            data: new FormData(this),
            cache: false,
            contentType: false,
            processData: false,
            success: function(data){
                // the upload_file_ajax.php endpoint returns the file name and a status message for the uploaded file
                console.log(data.filename, data.message);
                // we then inject these into the main data form
                var $hiddenInput = $('<input type="hidden" name="uploads[]" value="'+data.filename+'">');
                $('#main-form').append($hiddenInput);

                // show a thumbnail maybe?
                var $thumbnail = $('<img src="/uploaded_files/'+data.filename+'" width="40" height="40" />');
                $("#preview").append($thumbnail);

                $("#status").html(JSON.stringify(data.message));

                // reactivate file upload form to choose another file
                $('#file-upload-input').val('');
            },
            error: function(){
                console.log("error");
            }
        });
    });
}); 

修改后的HTML如下所示:

代码语言:javascript
复制
<form action="" method="post" enctype="multipart/form-data" id="main-form">
... (other inputs here)...
    <div class="form-group row offset-3 mb-3">
        <div class="col-12" id="preview"></div>
        <div class="col-12" id="status"></div>
    </div>

    <div class="form-group row mb-3 mb-3">
        <label class="col-sm-3 col-lg-3 col-form-label" for="file"><?php echo $label['attach-file']; ?></label>
        <div class="col-sm-8 col-lg-7">
            <input class="form-control custom-file-input" name="file" id="file" type="file" id="file-upload-input" form="file-upload-form" />
        </div>
    </div>

    <div class="form-group row">
        <div class="col-4 offset-3">
            <button type="submit" name="submit" class="btn btn-outline-success" form="main-form"><?php echo $label['submit-button']; ?></button>
        </div>
    </div>

    </form>
EN

回答 1

Stack Overflow用户

发布于 2022-06-11 07:29:45

我就是这样解决问题的。我在这里找到了答案,就这样,但再也找不到到帖子的链接。

独立上传文件、不提交表单或没有<form>...</form>标记的问题是,FormData();不像存在<form>...</form>标记时那样包含文件。因此,您需要将该文件附加到其中。

这是我负责文件上传的全部jQuery代码。在成功的情况下,它创建了包含上传文件信息的附加表单input标记,这样我就可以将它们与表单一起提交。它还为每个上传的图像创建了一个缩略图,并在input旁边创建了一个删除按钮,以防用户改变主意。

代码语言:javascript
复制
$('#file-upload-input').change(function(){
    var file_data = $('#file-upload-input').prop('files')[0];
    var form_data = new FormData();
    // pass the file itself – needed because the input is submitted without <form> tags
    form_data.append('file', file_data);
    // pass website language variable to the PHP processor to load the correct language file
    form_data.append('lang', '<?php echo $lang; ?>');
    $.ajax({
        url: "/ajax_upload_file.php",
        type: "POST",
        data: form_data,
        cache: false,
        contentType: false,
        processData: false,
        success: function(data){
            // the upload_file_ajax.php endpoint returns the file name and a status message for the uploaded file
            console.log(data.filename, data.message);
            // we then inject these into the main data form
            var $hiddenInput = $('<div class="input-group mb-1"><input class="form-control" readonly type="text" name="uploads[]" value="'+data.filename+'" /><input type="button" name="delete_'+data.filename+'" id="delete_'+data.filename+'" value="Delete" class="delete btn btn-outline-danger ms-2" /></div>');
            $('#uploaded_files').append($hiddenInput);
            // show a thumbnail if the uploaded file is an image
            var $thumbnail = $('<img src="/uploaded_files/'+data.filename+'" height="75" id="img_'+data.filename+'" class="me-1" />');
            $("#preview").append($thumbnail);
            // print a status message returned from the PHP processor
            $("#status").html(data.message);
            // reactivate file upload form to choose another file
            $('#file-upload-input').val('');
        },
        error: function(){
            console.log("error");
        }
    });
});

这是相关的HTML。它包含div,用于包含上传文件名称的input、缩略图(称为“预览”)和从PHP脚本返回的状态消息。

代码语言:javascript
复制
    <div class="form-group row offset-2 mb-3">
        <div class="col-sm-8 col-lg-7" id="uploaded_files">
        </div>
    </div>

    <div class="form-group row offset-2 mb-3">
        <div class="col-12" id="preview"></div>
    </div>

    <div class="form-group row offset-2 mb-3">
        <div class="col-12" id="status"></div>
    </div>

    <div class="form-group row mb-3 mb-3">
        <label class="col-sm-3 col-lg-2 col-form-label" for="file"><?php echo $label['attach-file']; ?></label>
        <div class="col-sm-8 col-lg-7">
            <input class="form-control custom-file-input" name="file" type="file" id="file-upload-input" />
        </div>
    </div>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72561640

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档