AJAX:将文件异步发布到服务器
AJAX: Asynchronously posting a file to a server
我想在不发布表单的情况下异步将文件发布到服务器。我有以下代码:
var fileInput = document.getElementById('FileInput');
var file = fileInput.files[0];
var formData = new FormData();
formData.append('file', file, file.name);
var xhr = new XMLHttpRequest();
xhr.open('POST', 'http://servername/controllername/AnalyseFile', true);
xhr.setRequestHeader('Content-Type', 'multipart/form-data');
xhr.send(formData);
但是,在服务器上执行该方法时,帖子正文不包含任何文件。以下内容来自 ASP.NET MVC4:
[HttpPost]
public JsonResult AnalyseFile()
{
int filesCount = Request.Files.Count;
if(filesCount == 0) { throw new Exception('no files...'); }
// do stuff
}
文件集合不包含任何文件,我不知道为什么。任何帮助表示赞赏。
在视图中,您可以执行以下操作:
<form>
<input name="input1" id="input1"/>
<input name="input2" id="input2"/>
<input name="input3" id="input3"/>
...
<input id="SelectedFile" name="SelectedFile" type="file"/>
</form>
和Javascript:
function AttLogic(_url, _data, _callback) {
$.ajax({
url: _url,
type: 'POST',
xhr: function () {
var myXhr = $.ajaxSettings.xhr();
if (myXhr.upload) { }
return myXhr;
},
data: _data,
cache: !1,
success: _callback,
contentType: !1,
processData: !1
});
}
function FormDataCustom(f) {
var __frm = jQuery(f), data = new FormData(f);
$(':disabled[name]', __frm).each(function () {
data.append(this.name, $(this).val());
});
return data;
}
function SaveLogic(){
var dt = FormDataCustom(document.forms[0]);
AttLogic(yourUrl, dt, function (r) {
//do something here
});
}
在控制器中:
public ActionResult Save(parameter1,parameter1,..., List<HttpPostedFileBase> SelectedFile)
{
//do something here
}
您需要从请求中读取 MultiPartFormData。
根据这篇文章:
您的方法将如下所示:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
namespace Some.Namespace
{
public class SomeController : ApiController
{
[HttpPost]
public async Task<JsonResult> AnalyseFile()
{
if (!Request.Content.IsMimeMultipartContent())
{
//If not throw an error
throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
}
MultipartFormDataStreamProvider streamProvider = new MultipartFormDataStreamProvider("c:''tmp''uploads");
// Read the MIME multipart content using the stream provider we just created.
IEnumerable<HttpContent> bodyparts = await Request.Content.ReadAsMultipartAsync(streamProvider);
// Get a dictionary of local file names from stream provider.
// The filename parameters provided in Content-Disposition header fields are the keys.
// The local file names where the files are stored are the values.
//depending on your version of .net, this might have been changed to FileData instead.
// see: https://msdn.microsoft.com/en-us/library/system.net.http.multipartformdatastreamprovider(v=vs.118).aspx
IDictionary<string, string> bodyPartFileNames = streamProvider.BodyPartFileNames;
//rest of code here
}
}
我还没有测试上面的代码,但它应该为你指明正确的方向。
另请查看如何接受文件 POST
有关最近的文章: https://code.msdn.microsoft.com/AngularJS-with-Web-API-22f62a6e
相关文章:
- 从要使用Protractor测试的服务器异步加载的动态数据列表的列表
- AJAX:将文件异步发布到服务器
- 嵌入/渲染异步加载服务器端生成的 SVG 时出现问题
- 当必须先在服务器上生成图像时,将图像异步预加载到浏览器缓存中
- 调用异步函数 befrore 服务器开始侦听
- 在 Node.js 服务器内发出异步请求错误:“类型错误:对象 #<对象> 没有方法'_implicitHeader'”
- Nodejs服务器-通过使循环迭代异步来提高性能
- 异步请求如何用于服务器端验证
- 在异步xhttp请求中传递url未命中服务器(尽管是第一次)-出现语法错误
- 在服务器端的节点中处理异步响应
- ASP.NET服务器端异步页面更新
- Node.js JavaScript如何在异步事件处理程序中访问oject数据;socket.on”;在TCP服务器中
- JavaScript异步时钟从服务器时间戳
- 在Vue中使用服务器端渲染时,异步数据更改
- 用c#从服务器端异步调用javascript函数
- 使用jQuery post或类似的异步JavaScript请求向服务器发送空数组
- 将基于java线程的tcp套接字服务器转换为javascript异步tcp套接字服务器
- 流星:对异步服务器方法的多次调用
- 流星服务器异步方法调用和使用返回结果
- 希望通过回调从远程服务器异步下载一系列文件