2


0

IE7での.aspxページのResponse.BinaryWriteイメージ

データベースからイメージをロードし、Response.BinaryWrite()を使用してそれをクライアントに書き戻す.aspxページを持つアプリケーションを保守します。 これは昔のことではありませんでした。 2つのことが変更されました。アプリケーションを.NET 3.5にアップグレードし、そして作業中のすべてのコンピュータをIE7にアップグレードしました。

Firefoxではすべてうまくいきますが、IE7で入手できるのは赤いXだけです。 だから私はこの問題はIE7に関連していると思いますか? .aspxフォームから画像をロードするのを防ぐためのセキュリティ設定がありますか。 拡張子ではなくコンテンツタイプに基づいて表示するようにすでに設定されています。

ここにいくつかのコードがあります。 私が言ったように、私はこのアプリをメンテナンスしているだけで書いていません。 私はSessionを使用するのはそれを行うのに最適な方法ではないことを知っていますが、それは私が持っているものであり、switchステートメントは単なる "wtf"です。

    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);
    }

編集:

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();
}

10 Answer


2


あなたのMIMEタイプは正しくありません。 これは、少なくとも画像についてはよりうまく機能します。

string contentType = "application /" extension.ToLower(); switch(extension.ToLower()){case "gif":contentType = "image / gif";ブレーク; case "jpg":case "jpeg":case "jpe":contentType = "image / jpeg";ブレーク; case "bmp":contentType = "image / bmp";ブレーク; case "tif":case "tiff":contentType = "image / tiff";ブレーク; case "eps":contentType = "application / postscript";ブレーク;デフォルト:Response.AppendHeader( "Content-disposition"、 "attachment; filename = content。"拡張子);ブレーク; Response.ContentType = contentType;

あなたがより多くを追加する必要があるならば、HeraはMIMEタイプとファイル拡張子です:http://www.w3schools.com/media/media_mimeref.asp


1


私はあなたに言うことができますイメージロードのこの方法はIE7でうまくいく(ちょうどしばらく前に同じsortaコードを書いていた)。 そのため、以下の問題が発生する可能性があります。1)ContentyTypeを設定する前にResponse.Clear()を実行し、最後にresponse.endを実行します。 2)セッションの延長にピリオド(。)がないことを確認してください。 .gifsの場合はgif、.jpgの場合はjpgなどです。

S


1


クライアント側のキャッシュ制御ヘッダーを含むいくつかのキャッシュを使用してページを設定することを検討してください。 これをするときあなたがそれぞれの個々の画像のために異なるファイル名を設定することを確認してください

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);

私はこのページをASHX httpハンドラにして、ページのライフサイクルのオーバーヘッドをなくすことにしました。

私はこの全部を数回書き終えておき、必要ならばコードを提供することができます。 このイメージエンドポイントは、1秒間に約80のリクエストを処理するサイトにあります。


0


あなたが試すかもしれません…​

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

…​right before…​

Response.ContentType = contentTypePrefix "/"拡張子。

IE7で正しいファイルタイプの関連付けを取得するためにそれを行う必要がありました。


0


次のように、コンテンツの気質を添付ファイルではなくインラインに設定してみてください。

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

ほとんどのブラウザはこの点で非常に柔軟性がありますが、「添付ファイル」はユーザーによるさらなるアクションを要求することを意図していました。 http://www.ietf.org/rfc/rfc1806.txt [IETF RFC 1806]:

_ 添付ファイルの表示は一般に、受信者側で積極的なアクションが必要であると解釈されますが、インラインメッセージコンポーネントは、メッセージが表示されるときに自動的に表示されます。 _


0


http://www.fiddlertool.com/fiddler/[Fiddler]のコピーを自分で入手して、画像のURLへの応答が何であるかを確認できます。

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


0


IE7の別のWebサイトにアクセスしてみてください。 他のWebサイトの画像は表示されますか?

画像が表示されない場合は、設定がある可能性があります(例: ウェブ開発者のツールバーまたはフィドラー)で「画像をロードしない」を選択します。


0


あなたのコードは非常に複雑です、なぜそれを少し単純化しないでください、それであなたはただコンテントタイプを設定するだけですか?

これが私が使うコードです、そしてそれはすべてのブラウザで動作します。

保護されたvoid Page_Load(オブジェクトセンダ、EventArgs e){byte [] jpg = .....

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


0


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

あなたのすべての提案をありがとう。


0


私はIE7について100%確信があるわけではありません、しかし私はie8と同様の問題に出くわしました。 私の問題の解決策は、私が "image / pjpeg"のコンテンツタイプをカバーしていることを確認することでした。 あなたがどれほど多くの異なる報道を必要とするかについてわからない、しかしこれは私の問題を解決した。