angularjs 中的文件上传
FileUpload in angularjs
我正在使用 angular-file-upload
,如 Here 中所见。它可以满足我的需要,但现在需求发生了变化,我希望能够随文件一起发送有关(对象)的其他数据。没有太多关于它的文档。据我所知,当我使用 options
指令作为属性并将数据作为对象提供时,它没有在 FileUploader 中的任何地方列出。另外,我的控制器在我上传时给我一个错误。我在 Post
中添加了一个模型 class 作为参数,这就是导致控制器中断的原因。
[HttpPost]
public Task<HttpResponseMessage> PostFile(QAFileAttribute QAFile)
{
this.QAFile = QAFile;
string newLocation = GetCurrentUploadDirectory();
HttpRequestMessage request = this.Request;
if(!request.Content.IsMimeMultipartContent())
{
throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
}
string root = UploadLocation; //newLocation;
var provider = new MultipartFormDataStreamProvider(root);
var task = request.Content.ReadAsMultipartAsync(provider)
.ContinueWith<HttpResponseMessage>(o =>
{
if (o.IsFaulted || o.IsCanceled)
{
Request.CreateErrorResponse(HttpStatusCode.InternalServerError, o.Exception);
}
foreach (MultipartFileData file in provider.FileData)
{
if(String.IsNullOrEmpty(file.Headers.ContentDisposition.FileName))
{
return Request.CreateResponse(HttpStatusCode.NotAcceptable, "Filename is not acceptable.");
}
UploadFile(file, QAFile);
}
return Request.CreateResponse(HttpStatusCode.OK);
});
return task;
}// end Post
那么,如何发送包含多个部分的文件以及其他数据?
这个link一定能帮到你,我已经实现了。
https://uncorkedstudios.com/blog/multipartformdata-file-upload-with-angularjs
app.service('fileUpload', ['$http', function ($http) {
this.uploadFileToUrl = function(file, additional, uploadUrl){
var fd = new FormData();
fd.append('file', file);
$.each(additional, function(obj) {
fd.append(obj.key,obj.value);
});
$http.post(uploadUrl, fd, {
transformRequest: angular.identity,
headers: {'Content-Type': undefined}
})
.success(function(){
})
.error(function(){
});
}
}]);
我自己想出来了。这 link 帮了大忙。事实证明,我不需要做很多事情来提供额外的数据。我只需要提供 formData 作为要在操作中处理的请求主体;控制器动作不带任何参数。我的代码的问题是(我想说由于 angular-file-upload 的文档不正确)我误解了 formData 是什么。原来,它是对象数组。它需要像这样:
var uploader = new FileUploader({
url: 'api/upload',
formData: [{...}]
});
这将数据作为请求正文发送到控制器操作。从那里,我只需要访问它作为 provider.FormData["somename"];
我正在使用 angular-file-upload
,如 Here 中所见。它可以满足我的需要,但现在需求发生了变化,我希望能够随文件一起发送有关(对象)的其他数据。没有太多关于它的文档。据我所知,当我使用 options
指令作为属性并将数据作为对象提供时,它没有在 FileUploader 中的任何地方列出。另外,我的控制器在我上传时给我一个错误。我在 Post
中添加了一个模型 class 作为参数,这就是导致控制器中断的原因。
[HttpPost]
public Task<HttpResponseMessage> PostFile(QAFileAttribute QAFile)
{
this.QAFile = QAFile;
string newLocation = GetCurrentUploadDirectory();
HttpRequestMessage request = this.Request;
if(!request.Content.IsMimeMultipartContent())
{
throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
}
string root = UploadLocation; //newLocation;
var provider = new MultipartFormDataStreamProvider(root);
var task = request.Content.ReadAsMultipartAsync(provider)
.ContinueWith<HttpResponseMessage>(o =>
{
if (o.IsFaulted || o.IsCanceled)
{
Request.CreateErrorResponse(HttpStatusCode.InternalServerError, o.Exception);
}
foreach (MultipartFileData file in provider.FileData)
{
if(String.IsNullOrEmpty(file.Headers.ContentDisposition.FileName))
{
return Request.CreateResponse(HttpStatusCode.NotAcceptable, "Filename is not acceptable.");
}
UploadFile(file, QAFile);
}
return Request.CreateResponse(HttpStatusCode.OK);
});
return task;
}// end Post
那么,如何发送包含多个部分的文件以及其他数据?
这个link一定能帮到你,我已经实现了。 https://uncorkedstudios.com/blog/multipartformdata-file-upload-with-angularjs
app.service('fileUpload', ['$http', function ($http) {
this.uploadFileToUrl = function(file, additional, uploadUrl){
var fd = new FormData();
fd.append('file', file);
$.each(additional, function(obj) {
fd.append(obj.key,obj.value);
});
$http.post(uploadUrl, fd, {
transformRequest: angular.identity,
headers: {'Content-Type': undefined}
})
.success(function(){
})
.error(function(){
});
}
}]);
我自己想出来了。这 link 帮了大忙。事实证明,我不需要做很多事情来提供额外的数据。我只需要提供 formData 作为要在操作中处理的请求主体;控制器动作不带任何参数。我的代码的问题是(我想说由于 angular-file-upload 的文档不正确)我误解了 formData 是什么。原来,它是对象数组。它需要像这样:
var uploader = new FileUploader({
url: 'api/upload',
formData: [{...}]
});
这将数据作为请求正文发送到控制器操作。从那里,我只需要访问它作为 provider.FormData["somename"];