2009-03-10 5 views
2

データベースからイメージに読み込まれた.aspxページを持つアプリケーションをメンテナンスし、Response.BinaryWrite()を使用してクライアントに書き戻します。これはずっと前に完全に機能しました。 2つの点が変更され、アプリケーションを.NET 3.5にアップグレードし、職場のすべてのコンピュータをIE7にアップグレードしました。.aspxページIE7のResponse.BinaryWriteイメージ

Firefox上ですべてうまく動作しますが、IE7には赤いXが表示されます。この問題はIE7に関連していると思いますか? .aspxフォームから画像を読み込まないようにするセキュリティ設定がありますか?拡張子ではなく内容の種類に基づいて表示するように設定されています。

ここにいくつかのコードを示します。私が言ったように、私はちょうどこのアプリを維持し、それを書きませんでした。私はセッションを使用してそれを行うのは素晴らしい方法ではないが知っているが、それは私が持っているとスイッチのステートメントは単なる "重量ですか?

<asp:image id="imgContent" runat="server" Visible="true" ImageUrl="ProductContentFormImage.aspx"></asp:image> 

    protected void Page_Load(object sender, System.EventArgs e) 
    { 
     Hashtable hshContentBinary = (Hashtable)Session["hshContentBinary"]; 
     byte[] content = (byte[]) hshContentBinary["content"]; 
     string extension = (string) hshContentBinary["extension"]; 


     string contentTypePrefix = "application"; 
     switch(extension.ToLower()) 
     { 
      case "gif": 
      case "jpg": 
      case "bmp": 
       contentTypePrefix = "image"; 
       break; 
      case "tif": 
       contentTypePrefix = "image"; 
       break; 
      case "tiff": 
       contentTypePrefix = "image"; 
       break; 
      case "eps": 
       contentTypePrefix = "image"; 
       break; 
      default: 
       Response.AppendHeader( 
        "Content-disposition", 
        "attachment; filename=content." + extension); 
       break; 
     } 
     Response.ContentType = contentTypePrefix + "/" + extension; 
     Response.BinaryWrite(content); 
    } 

EDIT:

OK、私はあなたの提案に続き、もう少し研究を通じて、私は次のようにメソッドを変更しているが、それはまだ動作しません。

protected void Page_Load(object sender, System.EventArgs e) 
{ 
    Hashtable hshContentBinary = (Hashtable)Session["hshContentBinary"]; 
    byte[] content = (byte[]) hshContentBinary["content"]; 
    string extension = (string) hshContentBinary["extension"]; 
    string contentType; 
    string contentDisposition = "inline; filename=content." + extension; 

    Response.ClearContent(); 
    Response.ClearHeaders(); 
    Response.Clear(); 

    switch(extension.ToLower()) 
    { 
     case "gif": 
      contentType = "image/gif"; 
      break; 
     case "jpg": 
     case "jpe": 
     case "jpeg": 
      contentType = "image/jpeg"; 
      break; 
     case "bmp": 
      contentType = "image/bmp"; 
      break; 
     case "tif": 
     case "tiff": 
      contentType = "image/tiff"; 
      break; 
     case "eps": 
      contentType = "application/postscript"; 
      break; 
     default: 
      contentDisposition = "attachment; filename=content." + extension; 
      contentType = "application/" + extension.ToLower(); 
      break; 
    } 

    Response.Buffer = true; 
    Response.Expires = 0; 
    Response.ContentType = contentType; 
    Response.AddHeader("Content-Length", content.Length.ToString()); 
    Response.AddHeader("Content-disposition", contentDisposition); 
    Response.Cache.SetCacheability(HttpCacheability.NoCache); 
    Response.BinaryWrite(content); 
    Response.End(); 
} 

答えて

0

IE7で表示できないように画像が壊れていましたが、Firefoxが壊れていました。画像が大きかったので画面に収まらず、どこが途切れているのかわかりませんでした。

ご意見ありがとうございます。

0

あなたは右の前に...

Response.ContentType = contentTypePrefix + "/" + extension; 

我々はIE7で正しいファイルタイプの関連付けを得るためにそれをしなければならなかった... ...

Response.ClearContent(); 
Response.ClearHeaders(); 

を試してみてください。ほとんどのブラウザはこの点で非常に柔軟ですが、「添付ファイル」が、ユーザによるさらなるアクションを必要とすることを意図していた

Response.AppendHeader( 
    "Content-disposition", 
    "inline; filename=content." + extension); 

:よう

0

は、代わりに添付ファイルのインライン化するためにあなたのコンテンツ配置を設定してみてください。 IETF RFC 1806:メッセージが表示されるとき、インラインメッセージ コンポーネントが自動的 表示されている間

アタッチメントの表示は、一般 受信者の一部に 正の作用を必要とすると解釈 あります。

2

あなたのMIMEタイプが正しくありません。これは、少なくとも画像のために、より良い作品:あなたがより多くを追加する必要がある場合

string contentType = "application/" + extension.ToLower(); 
switch(extension.ToLower()) { 
    case "gif": contentType = "image/gif"; break; 
    case "jpg": 
    case "jpeg": 
    case "jpe": contentType = "image/jpeg"; break; 
    case "bmp": contentType = "image/bmp"; break; 
    case "tif": 
    case "tiff": contentType = "image/tiff"; break; 
    case "eps": contentType = "application/postscript"; break; 
    default: 
     Response.AppendHeader( 
     "Content-disposition", 
     "attachment; filename=content." + extension); 
     break; 
} 
Response.ContentType = contentType; 

ヘラは、MIMEタイプとファイル拡張子です: http://www.w3schools.com/media/media_mimeref.asp

0

自分にFiddlerのコピーを取得しますので、あなたは何を見ることができますイメージURLへの応答はです。

可能であれば、代わりにASPXをASHXに変更してください。

1

私はIE7でこの画像ロードの仕方がうまく機能していると伝えます(ちょっと前に同じソートコードを書きました)。したがって、次のような問題が発生する可能性があります。 1)ContentyTypeを設定する前にResponse.Clear()を実行し、最後にresponse.endを実行してください。 2)セッションの内線番号にピリオド(。)が付いていないことを確認します。それは.gifsのためだけgif形式である必要があり、.JPGなどのためのjpg

S

0

はIE7で別のウェブサイトに行って取得を試みます。
他のウェブサイトの画像も表示されますか?

画像が表示されない場合は、「画像を読み込まないようにする」という設定(ウェブデベロッパーツールバーのORフィドラーなど)があると思われます。

0

あなたのコードは非常に複雑です。ちょっと単純化してコンテンツタイプを設定するのはなぜですか?

私が使用するコードは、すべてのブラウザで使用できます。

protected void Page_Load(object sender, EventArgs e) 
{ 
    byte[] jpg = ..... 

    Response.Clear(); 
    Response.ContentType = "image/jpeg"; 
    Response.BinaryWrite(jpg); 
    Response.End(); 
} 
1

クライアント側のキャッシュコントロールヘッダーを含むいくつかのキャッシュでページを設定することを検討してください。これを行うと、私が取得するだけでなくASHXのHTTPハンドラには、このページになるだろうあなたは、個々の画像

contentDisposition = String.Format("attachment; filename=content{0).{1}",fileName, fileExtension); 

とクライアント側のキャッシュ・ヘッダー

context.Response.Cache.SetMaxAge(TimeSpan.FromSeconds(YourDatabaseImageOrConfigFile.CacheSeconds)); 
context.Response.Cache.SetOmitVaryStar(true); 
context.Response.Cache.SetLastModified(YourDatabaseImage.ModifiedDate); 

のための別のファイル名を設定していることを確認してくださいページライフサイクルのオーバーヘッドを取り除きます。

私はこの全部を数回書いてあり、必要に応じてコードを提供することができます。この画像エンドポイントは約80件のリクエストを1秒間に送信するサイトにあります。

0

私はIE7について100%確信していませんが、ie8と同様の問題が発生しました。私の問題の解決策は、 "image/pjpeg"のコンテンツタイプを確実にカバーすることでした。あなたが必要とする数多くのカバレッジは確かではありませんが、これが私の問題を解決しました。

関連する問題