web-dev-qa-db-ja.com

ファイルをダウンロードする代わりにブラウザで開く

ユーザーにいくつかのドキュメントを表示するMVCプロジェクトがあります。ファイルは現在、Azure BLOBストレージに保存されています。

現在、ドキュメントは次のコントローラーアクションから取得されます。

[GET("{zipCode}/{loanNumber}/{classification}/{fileName}")]
public ActionResult GetDocument(string zipCode, string loanNumber, string classification, string fileName)
{
    // get byte array from blob storage
    byte[] doc = _docService.GetDocument(zipCode, loanNumber, classification, fileName);
    string mimeType = "application/octet-stream";
    return File(doc, mimeType, fileName);
}

現在、ユーザーが次のようなリンクをクリックすると:

<a target="_blank" href="http://...controller//GetDocument?zipCode=84016&loanNumber=12345678classification=document&fileName=importantfile.pdf

次に、ファイルがブラウザーのダウンロードフォルダーにダウンロードされます。私がやりたいのは(そして、デフォルトの動作だと思っていた)、ファイルをブラウザに表示するだけです。

Mimetypeを変更し、戻り値の型をActionResultではなくFileResultに変更してみましたが、どちらも無効です。

ダウンロードする代わりにブラウザでファイルを表示するにはどうすればよいですか?

47
Trevor

すべての答えのおかげで、解決策はそれらすべての組み合わせでした。

まず、byte[]を使用していたため、コントローラーアクションはFileContentResultだけでなくFileResultである必要がありました。これは次のおかげで見つかりました。 ASP.NET MVCの4つのファイル結果の違い

次に、MIMEタイプはoctet-streamである必要はありません。おそらく、ストリームを使用すると、ブラウザはファイルをダウンロードするだけになります。タイプapplication/pdfを変更する必要がありました。ただし、他の種類のファイル/ MIMEを処理するには、より堅牢なソリューションを検討する必要があります。

第三に、content-dispositioninlineに変更するヘッダーを追加する必要がありました。 この投稿 を使用すると、content-dispositionが既にattachmentに設定されているため、ヘッダーの重複を防ぐためにコードを変更する必要があることがわかりました。

成功したコード:

public FileContentResult GetDocument(string zipCode, string loanNumber, string classification, string fileName)
{
    byte[] doc = _docService.GetDocument(zipCode, loanNumber, classification, fileName);
    string mimeType = "application/pdf"
    Response.AppendHeader("Content-Disposition", "inline; filename=" + fileName);
    return File(doc, mimeType);
} 
88
Trevor

他の誰かが少し前に同様の質問をしたようです。

PDFファイルをブラウザで強制的に開く方法

ヘッダーを使用する必要があるという回答があります:

Content-Disposition: inline; filename.pdf
15
welegan

ブラウザは、MIMEタイプに基づいてダウンロードまたは表示を決定する必要があります。

これを試して:

string mimeType = "application/pdf";
4
André Pena