2017-08-05 9 views
0

イメージファイルをAzureブロブストアにアップロードするだけですが、ファイルはそこに作成されていますが、ファイルサイズがそれより大きくて、ブラウザでファイルをダウンロードすると、画像として開かれません。バイナリデータを適切にエンコードしてREST API PUT呼び出しを送信する方法

Azureインターフェイスを使用して同じファイルを手動でアップロードしましたが、そのファイルは22kで動作しています。私のコード経由でのアップロードは29kで動作しません。

注:このコードで使用されるすべての例は、テキストファイルのみを送信することに注意してください。たぶんEncoding.UTF8.GetBytes(requestBody);ラインはそれをやっている?

私はBase64では

HttpPostedFileBase hpf = Request.Files[file] as HttpPostedFileBase 
byte[] binData; 
using (BinaryReader b = new BinaryReader(hpf.InputStream)) 
    binData = b.ReadBytes(hpf.ContentLength); 

var result = System.Convert.ToBase64String(binData); 
new BlobHelper("STORENAMEHERE", "SECRETKEY").PutBlob("images", "test.jpg", result); 

私のデータを符号化しています場所です。これは、私がデータを置くために使用しているものです、それはhttps://azurestoragesamples.codeplex.com/

public bool PutBlob(string container, string blob, string content) 
{ 
    return Retry<bool>(delegate() 
    { 
     HttpWebResponse response; 

     try 
     { 
      SortedList<string, string> headers = new SortedList<string, string>(); 
      headers.Add("x-ms-blob-type", "BlockBlob"); 

      response = CreateRESTRequest("PUT", container + "/" + blob, content, headers).GetResponse() as HttpWebResponse; 
      response.Close(); 
      return true; 
     } 
     catch (WebException ex) 
     { 
      if (ex.Status == WebExceptionStatus.ProtocolError && 
       ex.Response != null && 
       (int)(ex.Response as HttpWebResponse).StatusCode == 409) 
       return false; 

      throw; 
     } 
    }); 
} 

public HttpWebRequest CreateRESTRequest(string method, string resource, string requestBody = null, SortedList<string, string> headers = null, 
    string ifMatch = "", string md5 = "") 
{ 
    byte[] byteArray = null; 
    DateTime now = DateTime.UtcNow; 
    string uri = Endpoint + resource; 

    HttpWebRequest request = HttpWebRequest.Create(uri) as HttpWebRequest; 
    request.Method = method; 
    request.ContentLength = 0; 
    request.Headers.Add("x-ms-date", now.ToString("R", System.Globalization.CultureInfo.InvariantCulture)); 
    request.Headers.Add("x-ms-version", "2009-09-19"); 

    if (headers != null) 
    { 
     foreach (KeyValuePair<string, string> header in headers) 
      request.Headers.Add(header.Key, header.Value); 
    } 

    if (!String.IsNullOrEmpty(requestBody)) 
    { 
     request.Headers.Add("Accept-Charset", "UTF-8"); 

     byteArray = Encoding.UTF8.GetBytes(requestBody); 
     request.ContentLength = byteArray.Length; 
    } 

    request.Headers.Add("Authorization", AuthorizationHeader(method, now, request, ifMatch, md5)); 

    if (!String.IsNullOrEmpty(requestBody)) 
     request.GetRequestStream().Write(byteArray, 0, byteArray.Length); 

    return request; 
} 
+1

サイズには関係ありませんが、リクエストのヘッダーには関係ありません。 'CreateRESTRequest()'を呼び出すコードを追加できますか? – vorou

+0

@vorou OP updated – user3953989

+0

22kから29kへのサイズの増加はおおよそ3:4なので、あなたはBase64エンコーディングがどこか2回あるように見えます。 – SBS

答えて

1

からだ私は、問題はどのようにしていると考えていますバイナリデータを文字列に変換してからバイト配列に変換し直しています。

バイナリデータを文字列に変換するときは、Encoding.UTF8.GetBytesを使用している文字列からバイト配列を取得している間にSystem.Convert.ToBase64Stringを使用しています。これはミスマッチを引き起こす可能性が最も高いです。

byteArray = System.Convert.FromBase64String(requestBody); 

byteArray = Encoding.UTF8.GetBytes(requestBody); 

、それが問題を解決する必要があります

次のコード行を変更してください。

+0

実際には、UTFエンコーディングとBase64エンコーディングの両方を削除することで、これを実現できました。提供された例は、明らかにテキストファイルでしか動作しないようにハードコードされていました。私はあなたがhttpで送信する前にそれをどこかでエンコードしなければならないと思った – user3953989

関連する問題