2012-05-08 12 views
29

Web APIを使用して休憩を呼び出そうとしますが、レスポンスをJSON base64でエンコードされた文字列ではなくデータベースに格納された実際のバイナリイメージにします。誰もがこれについていくつかの指摘を持っていますか?ASP .Net Web APIバイナリーとして画像をダウンロードする

Update- これは私が実装してしまったものです:

HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK); 
result.Content = new StreamContent(new MemoryStream(profile.Avatar)); 
result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); 
result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment"); 
result.Content.Headers.ContentDisposition.FileName = "avatar.png"; 
return result; 
+0

私はこの記事は、同様の質問 http://stackoverflow.com/questions/8340247/returning-を尋ねると思います安心できるイメージからのイメージ –

答えて

28

あなたはStreamContentオブジェクトへの応答内容を設定することができます。

 var fileStream = new FileStream(path, FileMode.Open); 

     var resp = new HttpResponseMessage() 
     { 
      Content = new StreamContent(fileStream) 
     }; 

     // Find the MIME type 
     string mimeType = _extensions[Path.GetExtension(path)]; 
     resp.Content.Headers.ContentType = new MediaTypeHeaderValue(mimeType); 
+2

質問に直接反応し、私が必要としていたものに最も近いものだったので、答えとしてマークしました。答える時間をとってくれてありがとう! – spaceagestereo

+0

Web APIからファイルを返す方法については、http://stackoverflow.com/a/14819168/179138 –

0

このタスクは、使用してなしをはるかに容易に達成されますWebAPI。私はユニークな拡張のためにカスタムHTTP handlerを実装し、バイナリ応答を返します。また、HTTP応答ヘッダーとコンテンツタイプも変更できるため、返される内容を完全に制御できます。

あなたは(あなたがそのURLに基​​づいて返すためにどのようなイメージを知ってどのように定義する)URLパターンを工夫し、あなたのAPIのリソースにこれらのURLを保つことができます。 URLがAPIレスポンスに返されると、ブラウザによって直接リクエストされ、HTTPハンドラに到達して正しいイメージが返されます。

画像は静的なコンテンツであり、HTTPやHTMLで自分の役割を持っている - APIで作業するときに使用されるJSONでそれらをミックスする必要はありませんが。

+10

で自分の答えの最後を見てください。私はOPがこれを行う方法を知りたいと思います** webapiを避ける方法の代わりに** webapi **を使用してください。 – EBarr

+0

正しいですが、私はHTTPハンドラのルートを認識していますが、それを考慮しましたが、私のコードがそのように分割されることは望ましくありませんでした。しかし、応答する時間を取ってくれてありがとう。 – spaceagestereo

+0

まあ、ちょうど私の2セント。私はいつもHTTPハンドラを使って簡単に見つけました。 – Slavo

16

これは回答としてマークされていますが、私が欲しかったものではありませんでした。これでわかりました。

public FileContentResult GetFile(string id) 
{ 
    byte[] fileContents; 
    using (MemoryStream memoryStream = new MemoryStream()) 
    { 
     using (Bitmap image = new Bitmap(WebRequest.Create(myURL).GetResponse().GetResponseStream())) 
      image.Save(memoryStream, ImageFormat.Jpeg); 
     fileContents = memoryStream.ToArray(); 
    } 
    return new FileContentResult(fileContents, "image/jpg"); 
} 

これは、URLで画像を取得するためのものです。あなただけのファイルサーバーからイメージをつかむしたい場合は、私はあなたがこの行を置き換え想像:

using (Bitmap image = new Bitmap(myFilePath)) 

はEDIT:これにより

using (Bitmap image = new Bitmap(WebRequest.Create(myURL).GetResponse().GetResponseStream())) 

気にしないが、これは通常のMVCのためです。 Web APIの場合、私はこれを持っています:

public HttpResponseMessage Get(string id) 
{ 
    string fileName = string.Format("{0}.jpg", id); 
    if (!FileProvider.Exists(fileName)) 
     throw new HttpResponseException(HttpStatusCode.NotFound); 

    FileStream fileStream = FileProvider.Open(fileName); 
    HttpResponseMessage response = new HttpResponseMessage { Content = new StreamContent(fileStream) }; 
    response.Content.Headers.ContentType = new MediaTypeHeaderValue("image/jpg"); 
    response.Content.Headers.ContentLength = FileProvider.GetLength(fileName); 
    return response; 
} 

これは、OPと非常に似ています。

+0

私の場合、Web APIのバージョンが必要でした。 –

+0

FileStreamオブジェクトについて... httpResponseMessageのDispose()デフォルトメソッドがストリームを適切に破棄するかどうかは誰にも分かりますか?私たちのセキュリティスキャンでは未解決の潜在的なリソースリークとしてこれを強調しています。 – jessewolfe

1

私はこの正確なことをしました。ここに私のコードは次のとおりです。

if (!String.IsNullOrWhiteSpace(imageName)) 
       { 
        var savedFileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, Path.Combine(uploadPath, imageName)); 
        var image = System.Drawing.Image.FromFile(savedFileName); 

        if (ImageFormat.Jpeg.Equals(image.RawFormat)) 
        { 
         // JPEG 
         using(var memoryStream = new MemoryStream()) 
         { 
          image.Save(memoryStream, ImageFormat.Jpeg); 

          var result = new HttpResponseMessage(HttpStatusCode.OK) 
           { 
            Content = new ByteArrayContent(memoryStream.ToArray()) 
           }; 

          result.Content.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg"); 
          result.Content.Headers.ContentLength = memoryStream.Length; 

          return result; 
         } 
        } 
        else if (ImageFormat.Png.Equals(image.RawFormat)) 
        { 
         // PNG 
         using (var memoryStream = new MemoryStream()) 
         { 
          image.Save(memoryStream, ImageFormat.Png); 

          var result = new HttpResponseMessage(HttpStatusCode.OK) 
          { 
           Content = new ByteArrayContent(memoryStream.ToArray()) 
          }; 

          result.Content.Headers.ContentType = new MediaTypeHeaderValue("image/png"); 
          result.Content.Headers.ContentLength = memoryStream.Length; 

          return result; 
         } 
        } 
        else if (ImageFormat.Gif.Equals(image.RawFormat)) 
        { 
         // GIF 
         using (var memoryStream = new MemoryStream()) 
         { 
          image.Save(memoryStream, ImageFormat.Gif); 

          var result = new HttpResponseMessage(HttpStatusCode.OK) 
          { 
           Content = new ByteArrayContent(memoryStream.ToArray()) 
          }; 

          result.Content.Headers.ContentType = new MediaTypeHeaderValue("image/gif"); 
          result.Content.Headers.ContentLength = memoryStream.Length; 

          return result; 
         } 
        } 
       } 

そして、クライアント上:

    var client = new HttpClient(); 
        var imageName = product.ImageUrl.Replace("~/Uploads/", ""); 
       var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, 
             Properties.Settings.Default.DeviceMediaPath + "\\" + imageName); 

       var response = 
        client.GetAsync(apiUrl + "/Image?apiLoginId=" + apiLoginId + "&authorizationToken=" + authToken + 
            "&imageName=" + product.ImageUrl.Replace("~/Uploads/","")).Result; 

       if (response.IsSuccessStatusCode) 
       { 
        var data = response.Content.ReadAsByteArrayAsync().Result; 
        using (var ms = new MemoryStream(data)) 
        { 
         using (var fs = File.Create(path)) 
         { 
          ms.CopyTo(fs); 
         } 
        } 

        result = true; 
       } 
       else 
       { 
        result = false; 
        break; 
       } 
関連する問題