【发布时间】:2015-03-09 05:16:13
【问题描述】:
美好的一天!
我正在开发一个 ASP.NET Web API 2 项目。在某个时候,需要上传一些文件。这些文件需要链接到某个 FileModel(我们自己的类)。因此,客户端需要发送 IEnumerable 作为参数和文件作为内容。因为它是一个 RESTful API,所以两者必须在同一个请求中发送。
我们能想到的最好的方法是跟随控制器动作:
public async Task<HttpResponseMessage> Add([FromUri] IEnumerable<FileModel> fileModels)
{
// REQUEST INTEGRITY TESTING
var streamProvider = new CustomMultipartFormDataStreamProvider(fileSavePath, fileModels);
// Read the MIME multipart content using the stream provider we just created.
var work = await Request.Content.ReadAsMultipartAsync(streamProvider).ContinueWith(async t =>
{
// SOME WORK DONE AFTER SAVING THE FILES TO THE HARD DRIVE
}
}
问题如下:上传的文件带有“multipart/form-data”Content-Type 标头。 在服务器端操作文件之前,我们需要知道 FileModels 的内容。如果我们使用MultipartFormDataStreamProvider,我们只能在文件已经保存到硬盘后才能访问非文件参数。
我们能找到的唯一解决方法是在 URL 中发送 IEnumerable
问题是:有没有办法同时提交 IEnumerable fileModels 参数和文件在请求正文中 并获得对 fileModels 的访问权限访问文件之前的参数?我们还希望能够使用 HttpContext.Current.Request.Files.Count;
我们目前用于文件上传的jQuery是这样的(为了早期测试,它只支持一个文件上传):
$('#Upload').click(function(e) {
e.preventDefault();
var headers = new Array();
headers["SessionId"] = sessionId;
var files = $('#fileInput').get(0).files;
var formData = new FormData();
formData.append("files", files[0]);
var fileModel = $('#fileSubmission').serialize();
$.ajax({
url: "api/Submissions/Add/?" + fileModel,
headers: headers,
type: 'POST',
data: formData,
cache: false,
contentType: false,
processData: false,
dataType: 'json'
});
});
非常感谢!
【问题讨论】:
-
您是否考虑过将整个数据以 JSON 格式发送并简单地将其反序列化为包含
Stream和元数据参数的类? -
是的,但文件最终总是为空。
-
您是否尝试过使用 MultipartFormDataStreamProvider。看看这个样本damienbod.wordpress.com/2014/03/28/…
标签: c# jquery file-upload asp.net-web-api2 multipartform-data