我有它建议我应该使用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));

其他回答

MVC框架本身就支持这一点。System.Web.MVC.Controller.File控制器提供了按名称/流/数组返回文件的方法。

例如,使用文件的虚拟路径,您可以执行以下操作。

return File(virtualFilePath, System.Net.Mime.MediaTypeNames.Application.Octet,  Path.GetFileName(virtualFilePath));

如果(string.IsNullOrWhiteSpace(文件名) 返回内容(“文件名不存在”);

        var path = Path.Combine(your path, your filename);

        var stream = new FileStream(path, FileMode.Open);

        return File(stream, System.Net.Mime.MediaTypeNames.Application.Octet, fileName);
   public ActionResult Download()
        {
            var document = //Obtain document from database context
    var cd = new System.Net.Mime.ContentDisposition
    {
        FileName = document.FileName,
        Inline = false,
    };
            Response.AppendHeader("Content-Disposition", cd.ToString());
            return File(document.Data, document.ContentType);
        }

你可以指定通用的八字节流MIME类型:

public FileResult Download()
{
    byte[] fileBytes = System.IO.File.ReadAllBytes(@"c:\folder\myfile.ext");
    string fileName = "myfile.ext";
    return File(fileBytes, System.Net.Mime.MediaTypeNames.Application.Octet, fileName);
}

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