web-dev-qa-db-ja.com

Chrome、pdf表示、サーバーから受信した重複ヘッダー

ウェブサイトに、ライトボックス内にPDFを表示するセクションがあります。最近のchromeアップグレードにより、これが表示されなくなりました:

エラー349(net :: ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION):複数のContent-Dispositionヘッダーを受信しました。これは、HTTP応答分割攻撃から保護するために許可されていません。

これはIEでも正常に機能します。

IIS6でASP.NET MVC3を使用しています

ファイルの生成に使用するコードは次のとおりです。

インラインステートメントを削除すると、ファイルがダウンロードされますが、ライトボックスの機能が壊れます。

問題コード

public FileResult PrintServices()
{
    //... unrelated code removed
    MemoryStream memoryStream = new MemoryStream();
    pdfRenderer.PdfDocument.Save(memoryStream);
    string filename = "ServicesSummary.pdf";

    Response.AppendHeader("Content-Disposition", "inline;");

    return File(memoryStream.ToArray(), "application/pdf", filename);
}

修正

削除する

Response.AppendHeader("Content-Disposition", "inline;");

次に変更

return File(memoryStream.ToArray(), "application/pdf", filename);

return File(memoryStream.ToArray(), "application/pdf");
58
BlairM

ファイル名を指定する必要がない場合は、上記の解決策で問題ありませんが、ユーザーに指定されたファイル名のデフォルトを維持する必要があります。

解決策は、ファイル名自体にコンマが含まれていたためです。カンマを「」に置き換えたところ、Chromeで期待どおりにファイルがドキュメントを配信するようになりました。

FileName = FileName.Replace(",", "")

Response.ContentType = "application/pdf"
Response.AddHeader("content-disposition", "attachment; filename=" & FileName)    
Response.BinaryWrite(myPDF)
70
2GDave

@roryokのコメントを使用して、ファイル名を引用符で囲みました。

Response.AddHeader("content-disposition", "attachment; filename=\"" + FileName + "\"")

IEでは、単一引用符を使用するというコーダーの答えは期待どおりに機能しませんでした。名前にまだ単一引用符が付いているダウンロードされたファイル。

20
Homer

今日この問題がありました。 roryokなどによると、解決策はファイル名を引用符で囲むことでした。

前、Chrome FAIL:

header("Content-Disposition: attachment; filename=$file");

現在、Chrome OK:

header("Content-Disposition: attachment; filename='$file'");

$fileを囲む引用符に注意してください。

2
a coder

私は同じ問題を抱えていましたが、returnステートメントからファイル名を削除するだけで修正しました。

変化する:

 return File(outStream.ToArray(), "application/pdf", "Certificate.pdf");

に:

 return File(outStream.ToArray(), "application/pdf");

そして、KEPT the:

Response.AddHeader("content-disposition", "attachment;filename=\"" + "Certificate.pdf" + "\"");

これにより、ダウンロードしたファイルの名前が保持されます。

1
Barry Franklin

私の問題は、次に示すように二重引用符によるものでした。

var encoding = System.Text.Encoding.UTF8;

*Response.AddHeader("Content-Disposition", string.Format("attachment; filename=**\"{0}\"**", HttpUtility.UrlEncode(file, encoding)));*

これを上記に変更するとうまくいきました!

*Response.AddHeader("Content-Disposition", string.Format("attachment; filename=**{0}**", HttpUtility.UrlEncode(file, encoding)));*
0
hatsrumandcode

カスタムファイル名を持つ任意のファイルタイプでこれを修正するには、(または同様のヘッダー)を削除します

Response.AppendHeader("Content-Disposition", "inline;");

そして追加

string fileName = "myfile.xlsx"
return File(fileStream, System.Web.MimeMapping.GetMimeMapping(Path.GetFileName(filePath)), fileName);

最初のパラメーターでストリームの代わりにファイルパスを使用することもできます

0
tedbaker