如何在一个方法中上传文件和FormData而不将文件保存在服务器上的磁盘上?

时间:2017-02-19 17:15:06

标签: c# asp.net-mvc angular typescript upload

我想将文件和一些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中使用其他参数发送二进制字符串文件? 有人知道这个问题的解决方案,或者可能有想法吗?

1 个答案:

答案 0 :(得分:2)

干净的方法是使用模型:

public class UploadForeignLigtCompanyCompanyFile
{
    public string ProjectId { get; set; }             
    public HttpPostedFileBase Attachment { get; set; }
}

并将后期操作方法更改为具有模型类型的参数:

public async void UploadForeignLigtCompanyCompanyFile(
    UploadForeignLigtCompanyCompanyFile companyFile)
{
    // code...
}

当然,您需要更改视图代码以将该信息提交给操作方法。