2013-04-12 17 views
4

問題: 我有一個Java spring rest服務來上傳文件(大尺寸)。 我想使用.NET httpClient(或其他.net客戶端)來調用上傳服務。c#HttpClient上傳文件到spring rest服務

問題:

  1. 看來,發送大文件,最好的辦法是多部分的文件,什麼是關於互操作性?
  2. 如果不可能,最好的選擇是什麼?

謝謝!

回答

4

這就是答案: 我可以從C#客戶端發送帶有多部分附件的文件到Java JAX Rest Webservice。

try 
     { 
      using (
      var client = new HttpClient()) 
      using (var form = new MultipartFormDataContent()) 
      { 
       using (var stream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { 
        using (var fileContent = new StreamContent(stream)) { 

         fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") {FileName = fileName, DispositionType = DispositionTypeNames.Attachment, Name = "fileData"}; 

         form.Add(fileContent); 
         // only for test purposes, for stable environment, use ApiRequest class. 
         response = client.PostAsync(url, form).Result; 
        } 
       } 
      } 

      return response.RequestMessage != null ? response.ReasonPhrase : null; 
     } 
     catch (Exception ex) 
     { 
      TraceManager.TraceError("Post Asyn Request to " + url + " \n" + ex.Message, ex); 
      throw; 
     } 
1

HTTP是一個獨立於操作系統平臺和編程語言的標準,所以如果你的.net客戶符合標準,你不應該在互操作性方面有任何問題。

+0

好吧,這是觀念,從邁克爾Teper [ASP.NET的WebAPI:如何與文件上傳執行多後使用WebApi HttpClient](http://stackoverflow.com/a/10744043)我將嘗試使用HttpClient API模擬多部分文件上傳文章。 – Donald

+0

我並不熟悉.net客戶端庫,但我想它會生成標準的多部分發布請求。我猜,服務器端的java/spring服務不會對客戶端的類型做任何假設,只接受普通的多部分請求,所以他們應該一起工作。 – zagyi

0

java的春天開機

@RequestMapping(value="/upload", method=RequestMethod.POST) 
public @ResponseBody String upload(@RequestParam("FileParam") MultipartFile file){ 
    InputStream fromClient=file.getInputStream(); 
    ...do stuff with the database/ process the input file... 

C#

HttpClient client = new HttpClient(); 
MultipartFormDataContent form = new MultipartFormDataContent(); 
FileInfo file = new FileInfo(@"<file path>"); 
form.Add(new StreamContent(file.OpenRead()),"FileParam",file.Name); 
HttpResponseMessage response = await client.PostAsync("http://<host>:<port>/upload", form); 
Console.WriteLine(response.StatusCode); 
Console.WriteLine(response.ReasonPhrase); 
Console.WriteLine(response.ToString()); 
Console.WriteLine(Encoding.ASCII.GetString(await response.Content.ReadAsByteArrayAsync()));