2017-02-19 10 views
1

ファイルとFormDataをサーバーにアップロードしたいと思います。私はそのようにそれをやったことだし、それが動作します。クライアント側ではサーバー上のディスクにファイルを保存せずにファイルとFormDataを1つの方法でアップロードする方法はありますか?

iは角度2を使用し、ロジックは次のなります

1.Inコンポーネント

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.Inサービス

サーバー側では
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でバイナリ文字列のようなファイルを送信する必要がありますか? 誰かがこの問題の解決策を知っているのでしょうか、それとも考えがあるのでしょうか?モデルタイプのパラメータを持つように

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

そして、あなたのポストのアクションメソッドを変更:

答えて

2

きれいな方法は、モデルを使用することですあなたが変更する必要があります。もちろん、

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

その情報をアクションメソッドに送信するためのビューコード。

+0

変更を見てください。私は詳細を追加しました。 – Seva