我想将文件和一些FormData
上传到服务器。我是这样做的,它确实有效:
在客户端,我使用Angular 2,逻辑看起来如下:
1.In component
onLoadForeignLightCompanies(event: any) {
let fileList: FileList = event.target.files;
if (fileList.length > 0) {
let file: File = fileList[0];
let formData: FormData = new FormData();
formData.append('projectId', this.projectId);
formData.append('file', file);
this.companyService.uploadForeginLightCompany(formData).then(result => {});
this.isLoading = false;
window.location.reload();
}
}
2.在服务中
uploadForeginLightCompany(formData: FormData): Promise<any> {
return this.http.post(this.baseUrl + 'foreignLightCompanyImport', formData).toPromise();
}
在服务器端
public byte[] LoadUploadedFile(HttpPostedFile uploadedFile)
{
var buf = new byte[uploadedFile.InputStream.Length];
uploadedFile.InputStream.Read(buf, 0, (int)uploadedFile.InputStream.Length);
return buf;
}
[HttpPost, Route("foreignLightCompanyImport")]
public async void UploadForeignLigtCompanyCompanyFile()
{
string root = HttpContext.Current.Server.MapPath("~/App_Data");
var file = LoadUploadedFile(HttpContext.Current.Request.Files[0]);
var provider = new MultipartFormDataStreamProvider(root);
await Request.Content.ReadAsMultipartAsync(provider);
var projectId = provider.FormData.GetValues("projectId")[0];
((IForeginLightCompanyService) Service).UploadDataFromExcel(file, Convert.ToInt32(projectId));
}
在服务器端使用以下结构。 HttpContext.Current.Server.MapPath("~/App_Data");
但在这种情况下,文件存储在磁盘上。我知道如何上传文件而不将其保存到磁盘。但在这种情况下我无法得到其他参数。像projectId
e.t.c。
如何在不保存磁盘文件的情况下进行此操作? 可能我必须在客户端使用模型并在json中使用其他参数发送二进制字符串文件? 有人知道这个问题的解决方案,或者可能有想法吗?
答案 0 :(得分:2)
干净的方法是使用模型:
public class UploadForeignLigtCompanyCompanyFile
{
public string ProjectId { get; set; }
public HttpPostedFileBase Attachment { get; set; }
}
并将后期操作方法更改为具有模型类型的参数:
public async void UploadForeignLigtCompanyCompanyFile(
UploadForeignLigtCompanyCompanyFile companyFile)
{
// code...
}
当然,您需要更改视图代码以将该信息提交给操作方法。