【问题标题】:How do I use AJAX to upload files to ASP.NET?如何使用 AJAX 将文件上传到 ASP.NET?
【发布时间】:2012-09-25 10:11:25
【问题描述】:

我正在尝试使用 AJAX 将文件上传到 ASP.NET。我有这个 Javascript:

var xhr = new XMLHttpRequest();

for (var i = 0; i < files.length; i++) {
   xhr.open('post', '/File/Upload', true);
   xhr.setRequestHeader("Content-Type", "multipart/form-data");
   var formData = new FormData();
   formData.append("_file", files[i]);
   xhr.send(files[i]);
}

filesArray()

然后我尝试在 C# 代码中访问 post 文件,但值始终为null。我该如何解决这个问题?

// Method 1, Result: file = null
HttpPostedFileBase file = Request.Files["_file"];

// Method 2, Result: postedFile.Count = 0
HttpFileCollectionBase postedFile = Request.Files;

【问题讨论】:

  • 你有什么例外
  • 无,无错误,无异常。

标签: c# xmlhttprequest


【解决方案1】:

假设您有以下包含文件输入字段的表单:

<form action="/home/index" method="post" enctype="multipart/form-data" onsubmit="return handleSubmit(this);">
    <input type="file" id="_file" name="_file" multiple="multiple" />
    <button type="submit">OK</button>
</form>

您可以尝试以下功能:

function handleSubmit(form) {
    if (!FormData) {
        alert('Sorry, your browser doesn\'t support the File API => falling back to normal form submit');
        return true;
    }

    var fd = new FormData();
    var file = document.getElementById('_file');
    for (var i = 0; i < file.files.length; i++) {
        fd.append('_file', file.files[i]);
    }

    var xhr = new XMLHttpRequest();
    xhr.open(form.method, form.action, true);
    xhr.onreadystatechange = function () {
        if (xhr.readyState == 4 && xhr.status == 200) {
            alert(xhr.responseText);
        }
    };
    xhr.send(fd);

    return false;
}

现在在服务器上,您应该能够使用Request.Files 检索文件。

【讨论】:

  • 是的,这是使用 HTML5 File API。
  • 文件 API 是什么意思?你是说浏览按钮吗?
  • 对不起,我看错了你的问题。您已经在使用文件 API。我已经更新了我的答案来展示一个例子。
  • 我不知道它是否会改变一些东西,但我没有将 HTML 用于我的表单。我正在使用带有文件字段的 sencha 表单来打开浏览窗口并获取文件。这是文件字段文档,请参阅实时预览:docs.sencha.com/ext-js/4-1/#!/api/Ext.form.field.File
【解决方案2】:

你也可以使用 jQuery

你有 2 个功能
阿贾克斯:http://api.jquery.com/jQuery.ajax/
加载(快捷方式,调用 ajax):http://api.jquery.com/load/
示例:http://www.w3schools.com/jquery/jquery_ajax.asp

已编辑:2012-10-04 16:31
原因:得到以下评论:
嗯,除非我不这样做'不明白,我不想加载服务器的信息,我想在我的服务器上获取我的 JS 代码中的信息。我已经有了要在文件 Array() 中发送的信息。 – 埃尔法耶

您所做的是对服务器进行 AJAX 调用,就像对 Web 服务一样。 这是一个例子

var value = 1;
var handlerUrl = [YOUR WEBSERVICE URL];

//Do the Ajax Call
jQuery.ajax({
  url: handlerUrl,
  data: { "params[]": [value] },
  type: 'POST',
  success: function (data)
  {
     alert("succes");
  },
  error: function (jxhr, msg, err)
  {
     alert("error");
  }
});

在 data 参数中你提供你的数据。
我以数组的形式在这里发送它,但您也可以像 1 参数一样发送它。 在我的情况下,您如何访问它是一个通用处理程序。

//Split the parameters and set in Array of Strings
var param = context.Request.Form[0].Split(',');
var value = param[0];

就像我说的那样,我以数组的形式给出它,所以我只有一个参数
然后我把它分开。但如果你想给它一个单一的属性,那么你
可以得到它:

context.Request.Form[0]
context.Request.Form[1]
context.Request.Form[2]
context.Request.Form[3]
context.Request.Form[4]

【讨论】:

  • 嗯,除非我不明白,我不想加载服务器的信息,我想在我的服务器上获取我的 JS 代码中的信息。我已经有信息要发送到files Array()。
  • 有趣!但是我怎样才能发送一个对象?因为 files 是一个对象的 Array(),每个对象都包含一个文件的信息。如果我这样做:data: { "params[]": [files[i]] }, 我得到:value = [Object File]。然后,我已经有了一个可以处理单个文件上传的上传方法(我正在执行多文件上传)。如果我能得到HttpPostedFile 或者(当然)HttpPostedFileBase,那么这种方法目前有效。
  • 嗯...我从来没有尝试过。但是做了一点谷歌搜索,似乎这是不可能的。您必须使用文件上传控件。在这里查看更多信息:stackoverflow.com/questions/408735/javascript-file-uploads
  • 再谷歌搜索一下,找到了一个可能的解决方案:openjs.com/articles/ajax/ajax_file_upload(虽然这是一个 PHP 教程)
猜你喜欢
  • 2021-05-31
  • 2016-12-06
  • 1970-01-01
  • 1970-01-01
  • 2017-11-12
  • 1970-01-01
  • 2018-09-20
  • 1970-01-01
  • 2021-03-21
相关资源
最近更新 更多