首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HTML5、文件API和jQuery发布镜像

HTML5、文件API和jQuery发布镜像
EN

Stack Overflow用户
提问于 2012-09-20 23:04:51
回答 1查看 1.4K关注 0票数 1

我有一个在对话框中显示的表单,它有一个"submit“按钮,当单击该按钮时,将使用jQuery使用AJAX将表单发送到服务器。这是一个MVC操作方法。上传的文件始终为空。在使用Google时,我读到你通常不能使用AJAX发布文件,除非你使用某种插件。

我不希望使用插件,我读到这可以通过支持HTML5文件API的浏览器来完成,所以我想让它使用这个插件。

目前我不关心拖放或其他任何事情,我只想使用jQuery将文件与表单的其余部分一起发布。

到目前为止,我有:

这是表单的局部视图:

代码语言:javascript
复制
@model ImageReceiptLineModel

@using (Html.BeginForm(MVC.EditImageReceiptLine(), FormMethod.Post, new { enctype = "multipart/form-data" }))
{
  @Html.HiddenFor(model => model.ReceiptLineSetID)
  @Html.HiddenFor(model => model.LineNumber)
  <input id="uploadFile" name="uploadFile" type="file" value="Choose New Image" />
  @Html.LabelFor(model => model.ImageDescription)
  @Html.TextBoxFor(model => model.ImageDescription)
}

这是用于发送表单的jQuery

代码语言:javascript
复制
if ($Form.valid()) {
        // get the url and the form data to send the request
        var Url = $Form.attr('action');
        var FormData = $Form.serialize();

        // now do the ajax call
        $.ajax({
            url: Url,
            data: FormData,
            type: 'POST',
            cache: 'false',
            success: function (data, textStatus, jqXHR) {
                // do something here
            },
            error: function (jqXHR, textStatus, errorThrown) {
                // do something here
            }
        });
    }

下面是MVC操作方法:

代码语言:javascript
复制
/// <summary>
/// Edit receipt line action
/// </summary>
/// <returns>Action result</returns>
[HttpPost]
public virtual ActionResult EditImageReceiptLine(HttpPostedFileBase uploadFile, ImageReceiptLineModel model)
{

}

要将文件添加到表单中,我需要在其中添加什么内容?"FormData“是我发送到服务器的序列化表单数据。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-21 18:01:07

这是一个关于File API的guide,可以用来上传文件。但别忘了这在IE9上是行不通的。如果你需要支持这样的浏览器,你可以使用隐藏的iframe来模拟AJAX上传文件。这就是像jquery.form这样的插件存在的原因。为了让它成为一行代码,这样你就不必担心浏览器的支持和其他东西了:

代码语言:javascript
复制
if ($Form.valid()) {
    // get the url and the form data to send the request
    $Form.ajaxSubmit({
        success: function (data, textStatus, jqXHR) {
            // do something here
        },
        error: function (jqXHR, textStatus, errorThrown) {
            // do something here
        }
    });
}

更新:

按照注释部分的要求,这里介绍了如何使用File API。

让我们假设您有以下形式:

代码语言:javascript
复制
@using (Html.BeginForm(MVC.EditImageReceiptLine(), null, FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    @Html.HiddenFor(model => model.ReceiptLineSetID)
    @Html.HiddenFor(model => model.LineNumber)
    <input id="uploadFile" name="uploadFile" type="file" value="Choose New Image" />
    @Html.LabelFor(model => model.ImageDescription)
    @Html.TextBoxFor(model => model.ImageDescription)    
}

和一些将触发表单提交的链接:

代码语言:javascript
复制
<a href="#" id="upload">Upload the file using HTML5 File API</a>

现在,在js文件中,您可以拥有以下内容:

代码语言:javascript
复制
$('#upload').click(function () {
    if (!window.FileReader) {
        // the browser doesn't support the File API - there's no need
        // to continue;
        alert('To use this functionality please use a modern browser');
        return;
    }

    var $form = $('form');
    var uri = $form.action;
    var xhr = new XMLHttpRequest();
    var fd = new FormData();

    $form.find(':input').each(function () {
        if ($(this).is('input[type="file"]')) {
            var files = $(this)[0].files;
            if (files.length > 0) {
                fd.append(this.name, files[0]);
            }
        } else {
            fd.append(this.name, $(this).val());
        }
    });

    xhr.open('POST', uri, true);
    xhr.onreadystatechange = function () {
        if (xhr.readyState == 4 && xhr.status == 200) {
            // handle response.
            alert(xhr.responseText); 
        }
    };

    xhr.send(fd);
});
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12515494

复制
相关文章

相似问题

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