我有它建议我应该使用FileResult允许用户从我的Asp下载文件。Net MVC应用程序。但我能找到的唯一例子总是与图像文件有关(指定内容类型image/jpeg)。
但如果我不知道文件类型怎么办?我希望用户能够从我的网站的文件区下载几乎任何文件。
我读过这样做的一种方法(见前一篇文章的代码),实际上工作得很好,除了一件事:在另存为对话框中出现的文件名与文件路径与下划线(folder_folder_file.ext)连接。此外,似乎人们认为我应该返回一个FileResult,而不是使用这个自定义类,我已经找到BinaryContentResult。
有人知道在MVC中做这样的下载的“正确”方式吗?
编辑:
我得到了答案(如下),但我只是想,如果其他人感兴趣,我应该张贴完整的工作代码:
public ActionResult Download(string filePath, string fileName)
{
string fullName = Path.Combine(GetBaseDir(), filePath, fileName);
byte[] fileBytes = GetFile(fullName);
return File(
fileBytes, System.Net.Mime.MediaTypeNames.Application.Octet, fileName);
}
byte[] GetFile(string s)
{
System.IO.FileStream fs = System.IO.File.OpenRead(s);
byte[] data = new byte[fs.Length];
int br = fs.Read(data, 0, data.Length);
if (br != fs.Length)
throw new System.IO.IOException(s);
return data;
}
GetFile应该关闭文件(或者在using中打开它)。然后,您可以在转换为字节后删除文件——下载将在字节缓冲区上完成。
byte[] GetFile(string s)
{
byte[] data;
using (System.IO.FileStream fs = System.IO.File.OpenRead(s))
{
data = new byte[fs.Length];
int br = fs.Read(data, 0, data.Length);
if (br != fs.Length)
throw new System.IO.IOException(s);
}
return data;
}
在下载方法中。
byte[] fileBytes = GetFile(file);
// delete the file after conversion to bytes
System.IO.File.Delete(file);
// have the file download dialog only display the base name of the file return File(fileBytes, System.Net.Mime.MediaTypeNames.Application.Octet, Path.GetFileName(file));
GetFile应该关闭文件(或者在using中打开它)。然后,您可以在转换为字节后删除文件——下载将在字节缓冲区上完成。
byte[] GetFile(string s)
{
byte[] data;
using (System.IO.FileStream fs = System.IO.File.OpenRead(s))
{
data = new byte[fs.Length];
int br = fs.Read(data, 0, data.Length);
if (br != fs.Length)
throw new System.IO.IOException(s);
}
return data;
}
在下载方法中。
byte[] fileBytes = GetFile(file);
// delete the file after conversion to bytes
System.IO.File.Delete(file);
// have the file download dialog only display the base name of the file return File(fileBytes, System.Net.Mime.MediaTypeNames.Application.Octet, Path.GetFileName(file));