iT邦幫忙

0

C# ASP.NET 下載圖片 HttpResponseMessage ContetType 沒有效

請問大大們一下 我使用ASP.NET MVC<img src="@URL"> 透過URL 去contorller 對應GetPic() function 然後去取server圖片然後轉成byte塞回前端 裡面可是我遇到了問題 :

設定了HttpResponseMessage Content.Headers.ContentType可是我輸出還是一直都是text/html;

Request Headers 也出現了 Provisional headers are shown
原本在asp Form裡面放在ApiController裡面是正常的移植過來MVC就出現了問題/images/emoticon/emoticon06.gif

該如何讓他下載輸出在 我的<img src="@URL"> 裡面呢....求大神解救了

https://ithelp.ithome.com.tw/upload/images/20190710/20109483urf1EOpRQg.png

public HttpResponseMessage GetPic(string id)
        {
           
            HttpWebRequest webRequest = (HttpWebRequest)HttpWebRequest.Create("------URL------");
            webRequest.AllowWriteStreamBuffering = true;
            webRequest.Timeout = 30000;

            byte[] res = null;
            using (WebResponse response = webRequest.GetResponse())
            {
                byte[] buffer = new byte[4096];
                using (Stream responseStream = response.GetResponseStream())
                {
                    using (MemoryStream memoryStream = new MemoryStream())
                    {
                        int count = 0;
                        do
                        {
                            count = responseStream.Read(buffer, 0, buffer.Length);
                            memoryStream.Write(buffer, 0, count);
                        }
                        while (count != 0);

                        res = memoryStream.ToArray();
                    }
                }
            }
            MemoryStream toImages = new MemoryStream(res);


            HttpResponseMessage result = new HttpResponseMessage();
            result.Content = new ByteArrayContent(toImages.ToArray());
            result.Content.Headers.ContentType = new MediaTypeHeaderValue("image/png");
            result.StatusCode = HttpStatusCode.OK;

            return result;
        }

07/10 16:10 補充一下 像是蝦皮取得圖片的方法雷同 他一樣是自訂義URL
可是他Request Headers內擁有著很多資訊 而我卻 Provisional headers are shown 卡著。

MVC 也有著自己的 token 需要去解開隱私性嗎 ???

https://cf.shopee.tw/file/a54e5e0ba97ecad7a1fc822ab5d72f51
https://ithelp.ithome.com.tw/upload/images/20190710/20109483vKY3bQPtDD.png

我額度滿了,只好貼這裡
在你主程式 Response.BinaryWrite(GetPic(......))後面加上兩句
Response.Flush();
Response.End(); // 避免繼續再輸出ASPX HTML的部份
這是我做EXCEL輸出的例子,沒回傳值,直接就在這END掉
private void ExportExcel(string pnos = "")
{
if (pnos != "")
{
string[] projnos = pnos.Split(',').Where(p => p != "").ToArray();
if (projnos.Any())
{
ExcelPackage excel = new ExcelPackage();
驗收明細表(excel, projnos);
byte[] respdata = excel.GetAsByteArray();
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
Response.AddHeader("content-length", respdata.Length.ToString());
Response.AddHeader("content-disposition", "attachment; filename=Z992匯出報告" + DateTime.Now.Ticks.ToString() + ".xlsx");
Response.BinaryWrite(respdata);
Response.Flush();
Response.End();
}
}
}
king1761 iT邦新手 5 級 ‧ 2019-07-10 15:54:58 檢舉
@japhenchen 我嘗試了加上Response.Flush();Response.End(); 仍然沒有作用
會是因為要設定些什麼 才會將我的瀏覽器資訊一起丟出去嗎 ? 因為我看Request Header 那邊傳遞出去的資訊很少,相較於我在form時做的差滿多的少了cookie那些

2 個回答

1
sion
iT邦新手 5 級 ‧ 2019-07-10 16:33:34

https://stackoverflow.com/questions/12240713/put-content-in-httpresponsemessage-object
試著用 Request.CreateResponse 吧

stackoverflow裡應該有你要的答案

看更多先前的回應...收起先前的回應...
king1761 iT邦新手 5 級 ‧ 2019-07-10 16:59:35 檢舉

上訴所說的我已經有使用了 (?)

HttpResponseMessage result = new HttpResponseMessage();
result.Content = new ByteArrayContent(toImages.ToArray());
result.Content.Headers.ContentType = new MediaTypeHeaderValue("image/png");
result.StatusCode = HttpStatusCode.OK;

return result;
fillano iT邦超人 1 級 ‧ 2019-07-11 14:06:56 檢舉

你用的是webRequest.GetResponse(),他說的是webRequest.CreateResponse()

king1761 iT邦新手 5 級 ‧ 2019-07-12 10:08:11 檢舉
webRequest.CreateResponse()

應該是在舊版本WebAPI底下製作的吧

king1761 iT邦新手 5 級 ‧ 2019-07-12 11:19:17 檢舉

最後解法 直接.....就可以了 冏
return File(toImages.ToArray(), "image/png");

fillano iT邦超人 1 級 ‧ 2019-07-12 12:18:42 檢舉

這等於FileStreamResult,是.NET MVC支援的輸出類型。

0
fillano
iT邦超人 1 級 ‧ 2019-07-12 12:17:16

.NET MVC 的動作結果並不支援HttpResponseMessage這種類型。請參閱:

https://docs.microsoft.com/zh-tw/aspnet/mvc/overview/older-versions-1/controllers-and-routing/aspnet-mvc-controllers-overview-cs

底下的「了解動作結果」。因為不支援,所以他不會幫你處理,所以不會得到輸出的結果,但是也不會報錯。你把:

using (MemoryStream memoryStream = new MemoryStream())

改成

using(Stream memoryStream = Response.OutputStream)

然後在這之前設定Response.ContentType就可以正確輸出。

我要發表回答

立即登入回答