逻辑重构2

写在前面

上篇文章修改文件上传的逻辑,这篇修改下文件下载的逻辑。

文件下载

下载传入的参数不变,但是这个时候需要根据文件的md5,去目录NetDisk中查找文件。这样才能真正的找到物理文件。

代码如下:

/// <summary>
/// 文件下载
/// </summary>
/// <param name="fileId"></param>
public void DownLoadFile(string fileId)
{
    UserInfo userInfo = Session["user"] as UserInfo;
    if (userInfo == null)
    {
        RedirectToAction("Login", "UserInfo");
        return;
    }
    if (string.IsNullOrEmpty(fileId))
    {
        throw new ArgumentNullException("fileId is errror");
    }
    int id = Convert.ToInt32(fileId);
    var findFile = _myFileServiceRepository.Find(x => x.Id == id);
    if (findFile == null)
    {
        AlertMsg("文件不存在", "");
        return;
    }
    string filePath = Path.Combine(Server.MapPath("~/NetDisk/"), findFile.FileMd5 + findFile.FileExt);
    //以字符流的形式下载文件
    FileStream fs = new FileStream(filePath, FileMode.Open);
    byte[] bytes = new byte[(int)fs.Length];
    fs.Read(bytes, 0, bytes.Length);
    fs.Close();
    Response.ContentType = "application/octet-stream";
    //通知浏览器下载文件而不是打开
    Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(findFile.FileName, System.Text.Encoding.UTF8));
    Response.BinaryWrite(bytes);
    Response.Flush();
    Response.End();
}

总结

下载的逻辑也很好修改,只是修改一下文件的路径,在数据库中已经存有md5和文件的扩展名,这时候拼接一个文件的真实路径就可以了。