filestream.write
を使用して、データをサーバーからクライアントにダウンロードしてダウンロードします。その場合、ファイルをダウンロードできますが、ブラウザにダウンロードとして表示されません。 [名前を付けて保存]のポップアップが表示されず、[ダウンロード]セクションに[ダウンロードバー]が表示されない。周りを見渡してみると、この応答には添付ファイルがあることをブラウザに伝えるために、応答ヘッダーに「何か」を含める必要があると思います。また、クッキーを設定したいです。これを達成するために、これは私がやっていることです:
[HttpContext.Current.Response.AppendHeader("Content-Disposition","attachment;filename=" & name)]
public ActionResult Download(string name)
{
// some more code to get data in inputstream.
using (FileStream fs = System.IO.File.OpenWrite(TargetFile))
{
byte[] buffer = new byte[SegmentSize];
int bytesRead;
while ((bytesRead = inputStream.Read(buffer, 0, SegmentSize)) > 0)
{
fs.WriteAsync(buffer, 0, bytesRead);
}
}
}
return RedirectToAction("Index");
}
「System.web.httpcontext.currentはプロパティであり、タイプとして使用されています」というエラーが発生します。
ヘッダーの更新を適切な場所で行っていますか?これを行う他の方法はありますか?
はい、これは間違った方法で行っています。属性ヘッダーとしてではなく、アクション内にヘッダーを追加する必要があります。
HttpContext.Current.Response.AppendHeader("Content-Disposition","attachment;filename=" & name)
または
Request.RequestContext.HttpContext.Response.AddHeader("Content-Disposition", "Attachment;filename=" & name)
pdate私が理解しているように、直接コントローラを呼び出すことによってファイルのダウンロードに機能しないコントローラ/アクションにajax呼び出しを行っていますアクション。この方法でそれを達成できます。
public void Download(string name)
{
//your logic. Sample code follows. You need to write your stream to the response.
var filestream = System.IO.File.ReadAllBytes(@"path/sourcefilename.pdf");
var stream = new MemoryStream(filestream);
stream.WriteTo(Response.OutputStream);
Response.AddHeader("Content-Disposition", "Attachment;filename=targetFileName.pdf");
Response.ContentType = "application/pdf";
}
または
public FileStreamResult Download(string name)
{
var filestream = System.IO.File.ReadAllBytes(@"path/sourcefilename.pdf");
var stream = new MemoryStream(filestream);
return new FileStreamResult(stream, "application/pdf")
{
FileDownloadName = "targetfilename.pdf"
};
}
JSボタンをクリックすると、これと同じようなことができます。
$('#btnDownload').click(function () {
window.location.href = "controller/download?name=yourargument";
});
ご覧ください こちら 。
以下は、参照されているWebサイトからの引用です。
public FileStreamResult StreamFileFromDisk()
{
string path = AppDomain.CurrentDomain.BaseDirectory + "uploads/";
string fileName = "test.txt";
return File(new FileStream(path + fileName, FileMode.Open), "text/plain", fileName);
}
編集1:
私たちの古き良きSOからあなたの興味を引くかもしれない何かを追加します。詳細については、 ここ で確認できます。
public ActionResult Download()
{
var document = ...
var cd = new System.Net.Mime.ContentDisposition
{
// for example foo.bak
FileName = document.FileName,
// always Prompt the user for downloading, set to true if you want
// the browser to try to show the file inline
Inline = false,
};
Response.AppendHeader("Content-Disposition", cd.ToString());
return File(document.Data, document.ContentType);
}
変化する:
return RedirectToAction("Index");
に:
return File(fs, "your/content-type", "filename");
そして、returnステートメントをusingステートメント内に移動します。
以前は、一部のドメインがサイトをiframe化できるようにホワイトリストを作成しました。 iframeサイトにも使用されているGoogleの画像キャッシュを覚えておいてください。
static HashSet<string> frameWhiteList = new HashSet<string> { "www.domain.com",
"mysub.domain.tld",
"partner.domain.tld" };
protected void EnforceFrameSecurity()
{
var framer = Request.UrlReferrer;
string frameOptionsValue = "SAMEORIGIN";
if (framer != null)
{
if (frameWhiteList.Contains(framer.Host))
{
frameOptionsValue = string.Format("ALLOW-FROM {0}", framer.Host);
}
}
if (string.IsNullOrEmpty(HttpContext.Current.Response.Headers["X-FRAME-OPTIONS"]))
{
HttpContext.Current.Response.AppendHeader("X-FRAME-OPTIONS", frameOptionsValue);
}
}
public FileResult DownloadDocument(string id)
{
if (!string.IsNullOrEmpty(id))
{
try
{
var fileId = Guid.Parse(id);
var myFile = AppModel.MyFiles.SingleOrDefault(x => x.Id == fileId);
if (myFile != null)
{
byte[] fileBytes = myFile.FileData;
return File(fileBytes, System.Net.Mime.MediaTypeNames.Application.Octet, myFile.FileName);
}
}
catch
{
}
}
return null;
}