2016-10-26 5 views
1

Web APIとRESTサービスが新しく、ファイルのアップロードを受け付ける簡単なRESTサーバーを構築しようとしています。私は簡単で理解しやすいブドウを見つけました。ファイルアップロードの例が見つかりませんでしたか?grapevineのファイルのアップロード例

これはSystem.Web.Http

var streamProvider = new MultipartFormDataStreamProvider(ServerUploadFolder); 

await Request.Content.ReadAsMultipartAsync(streamProvider); 

が、プロパティはそれを行うための任意の方法を持っていないブドウの要求を使用した例です。誰かが私に例を教えてもらえますか?

答えて

0

ファイルをバイナリペイロードとしてアップロードする場合は、GitHubのthis question/answerを参照してください。

フォーム送信からファイルをアップロードしようとしている場合は、マルチパートペイロードパーサーがまだ追加されていないため、やや難解ですが、それでも可能です。

次のコードサンプルでは、​​完全なテストされていない、と私はちょうど私の頭の上にこれをオフに書いたので、それが最善の解決策ではないかもしれませんが、それは出発点です:あなたが探している場合

public static class RequestExtensions 
{ 
    public static IDictionary<string, string> ParseFormUrlEncoded(this IHttpRequest request) 
    { 
     var data = new Dictionary<string, string>(); 

     foreach (var tuple in request.Payload.Split('=')) 
     { 
      var parts = tuple.Split('&'); 
      var key = Uri.UnescapeDataString(parts[0]); 
      var val = Uri.UnescapeDataString(parts[1]); 
      if (!data.ContainsKey(key)) data.Add(key, val); 
     } 

     return data; 
    } 

    public static IDictionary<string, FormElement> ParseFormData(this IHttpRequest request) 
    { 
     var data = new Dictionary<string, FormElement>(); 
     var boundary = GetBoundary(request.Headers.Get("Content-Type")); 

     if (boundary == null) return data; 

     foreach (var part in request.Payload.Split(new[] { boundary }, StringSplitOptions.RemoveEmptyEntries)) 
     { 
      var element = new FormElement(part); 
      if (!data.ContainsKey(element.Name)) data.Add(element.Name, element); 
     } 

     return data; 
    } 

    private static string GetBoundary(string contenttype) 
    { 
     if (string.IsNullOrWhiteSpace(contenttype)) return null; 

     return (from part in contenttype.Split(';', ',') 
      select part.TrimStart().TrimEnd().Split('=') 
      into parts 
      where parts[0].Equals("boundary", StringComparison.CurrentCultureIgnoreCase) 
      select parts[1]).FirstOrDefault(); 
    } 
} 

public class FormElement 
{ 
    public string Name => _dispositionParams["name"]; 
    public string FileName => _dispositionParams["filename"]; 
    public Dictionary<string, string> Headers { get; private set; } 
    public string Value { get; } 

    private Dictionary<string, string> _dispositionParams; 

    public FormElement(string data) 
    { 
     var parts = data.Split(new [] { "\r\n\r\n", "\n\n" }, StringSplitOptions.None); 
     Value = parts[1]; 

     ParseHeaders(parts[0]); 
     ParseParams(Headers["Content-Disposition"]); 
    } 

    private void ParseHeaders(string data) 
    { 
     Headers = data.TrimStart().TrimEnd().Split(new[] {"\r\n", "\n"}, StringSplitOptions.RemoveEmptyEntries).Select(header => header.Split(new[] {':'})).ToDictionary(parts => parts[0].TrimStart().TrimEnd(), parts => parts[1].TrimStart().TrimEnd()); 
    } 

    private void ParseParams(string data) 
    { 
     _dispositionParams = new Dictionary<string, string>(); 

     foreach (var part in data.Split(new[] {';'})) 
     { 
      if (part.IndexOf("=") == -1) continue; 
      var parts = part.Split(new[] {'='}); 
      _dispositionParams.Add(parts[0].TrimStart(' '), parts[1].TrimEnd('"').TrimStart('"')); 
     } 
    } 
} 

すぐに使用する非同期のものについては、私がテストしていないthis stackoverflow questionへの回答を実装しようとすることができます。

関連する問題