• 获取下载文件的路径


    //下载action

    public void GetFile(string guid)
    {
    if (string.IsNullOrEmpty(guid))
    {
    Response.Write("<script>alert('参数错误');</script>");
    }

    //获取下载文件路径
    string filePath = GetDownPath(guid);
    if (!System.IO.File.Exists(filePath))
    {
    Response.Write("<script>alert('文件不存在');</script>");
    return;
    }

    ChunkTransfer(System.Web.HttpContext.Current, filePath);
    HttpContext.Response.Flush();

    string tempFolder = fileName.Substring(0, fileName.LastIndexOf('\'));
    //删除临时文件
     DeleteDirectory(tempFolder);
    }

    //guid为创建下载文件时,所保存在的文件夹的名称,且该文件夹下只有一个文件,为要下载的文件

    public string GetDownPath(string guid)
    {

    string fileDirectory = Path.Combine("临时文件夹", "文件路径");
    if (Directory.Exists(fileDirectory))
    {
    DirectoryInfo dirInfo = new DirectoryInfo(fileDirectory);
    string fileName = string.Empty;

    //然后在当前路径下查找excel文件
    FileInfo[] fileInfo = dirInfo.GetFiles("*.xlsx");
    if (fileInfo != null && fileInfo.Count() > 0)
    {
    foreach (FileInfo file in dirInfo.GetFiles("*.xlsx"))
    {
    fileName = file.FullName.Substring(file.FullName.LastIndexOf("\") + 1);
    }
    }
    return Path.Combine(fileDirectory, fileName);
    }
    return "";
    }

    //将文件放到输出流中

    public bool ChunkTransfer(HttpContext httpContext, string filePathName)
    {
    bool result = false;

    if (!System.IO.File.Exists(filePathName))
    {
    httpContext.Response.StatusCode = 404;
    return false;
    }
    long startPostion = 0;
    long endPostion = 0;
    string fileName = Path.GetFileName(filePathName);
    using (FileStream fileStream = new FileStream(filePathName, FileMode.Open, FileAccess.Read, FileShare.Read))
    {
    using (BinaryReader br = new BinaryReader(fileStream))
    {
    long fileLength = fileStream.Length;
    string lastUpdateTime = System.IO.File.GetLastWriteTimeUtc(filePathName).ToString("r");
    string eTag = HttpUtility.UrlEncode(fileName, Encoding.UTF8) + lastUpdateTime;//恢复下载时提取请求头;
    if (httpContext.Request.Headers["If-Range"] != null)
    {
    if (httpContext.Request.Headers["If-Range"].Replace(""", "") != eTag)
    {//文件修改过
    httpContext.Response.StatusCode = 412;//预处理失败
    return false;
    }
    }

    httpContext.Response.Clear();
    httpContext.Response.Buffer = false;
    httpContext.Response.AddHeader("Accept-Ranges", "bytes");
    httpContext.Response.AppendHeader("ETag", """ + eTag + """);
    httpContext.Response.AppendHeader("Last-Modified", lastUpdateTime);//把最后修改日期写入响应
    httpContext.Response.ContentType = "application/octet-stream";
    if (httpContext.Request.UserAgent.IndexOf("MSIE") > -1 || (httpContext.Request.UserAgent.IndexOf("like Gecko") > -1))
    {
    fileName = HttpUtility.UrlEncode(fileName, Encoding.UTF8).Replace("+", "%20");
    }

    if (httpContext.Request.UserAgent.ToLower().IndexOf("firefox") > -1)
    {
    httpContext.Response.AddHeader("Content-Disposition", "attachment;filename="" + fileName + """);
    }
    else
    {
    httpContext.Response.AddHeader("Content-Disposition", "attachment;filename=" + fileName);
    }
    httpContext.Response.AddHeader("Connection", "Keep-Alive");
    httpContext.Response.ContentEncoding = Encoding.UTF8;
    if (httpContext.Request.Headers["Range"] != null)//续传
    {
    httpContext.Response.StatusCode = 206;//续传标识
    string[] range = httpContext.Request.Headers["Range"].Split(new char[] { '=', '-' });
    startPostion = long.Parse(range[1]);//已经下载的字节数
    if (startPostion < 0 || startPostion >= fileLength)
    {
    return false;
    }
    if (string.IsNullOrEmpty(range[2]))//只指定请求文件起始
    {
    httpContext.Response.AddHeader("Content-Range", string.Format(" bytes {0}-{1}/{2}", startPostion, fileLength - 1, fileLength));
    httpContext.Response.AddHeader("Content-Length", (fileLength - startPostion).ToString());
    }
    else//指定请求文件范围
    {
    endPostion = long.Parse(range[2]);
    httpContext.Response.AddHeader("Content-Range", string.Format(" bytes {0}-{1}/{2}", startPostion, endPostion - startPostion - 1, fileLength));
    httpContext.Response.AddHeader("Content-Length", (endPostion - startPostion).ToString());
    }
    }
    else
    {//非续传
    httpContext.Response.AddHeader("Content-Range", string.Format(" bytes {0}-{1}/{2}", startPostion, fileLength - 1, fileLength));
    httpContext.Response.AddHeader("Content-Length", (fileLength - startPostion).ToString());
    }

    br.BaseStream.Seek(startPostion, SeekOrigin.Begin);
    long maxCount = (long)Math.Ceiling((fileLength - startPostion + 0.0) / TransferBuffer);//分块下载,剩余部分可分成的块数
    for (long i = 0; i < maxCount && httpContext.Response.IsClientConnected; i++)
    {
    httpContext.Response.BinaryWrite(br.ReadBytes(TransferBuffer));
    httpContext.Response.Flush();
    if (TransferSleep > 0)
    {
    Thread.Sleep(TransferSleep);
    }
    }

    result = true;

    }
    }


    return result;
    }

    #region 删除文件夹
    /// <summary>
    /// 如指定目录存在,删除其并删除该目录中的任何子目录
    /// </summary>
    /// <param name="path">目录路径</param>
    public static void DeleteDirectory(string path)
    {
    if (string.IsNullOrEmpty(path.Trim()))
    return;
    if (Directory.Exists(path))
    {
    Directory.Delete(path, true);
    }
    }

    #endregion

  • 相关阅读:
    HTTP解决了什么问题?
    OSI模型--TCP/IP
    USB取证工具-Usbrip
    ModSecurity OWASP 规则集说明
    WAF简介及ModSecurity-nginx搭建
    aSYNcrone-ddos
    Centos7安装php7.1
    Centos7基于LNMP架构搭建DVWA
    web扫描器-uniscan
    基于腾讯云搭建宝塔面板
  • 原文地址:https://www.cnblogs.com/hobby0524/p/6834459.html
Copyright © 2020-2023  润新知