LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

asp.net从ftp下载大文件再输出浏览器的实现(对文件同时进行读写操作)

admin
2021年3月3日 11:12 本文热度 3464
很多时候安全起见,不会让用户通过浏览器直接从ftp下载文件。这时我们需要web从ftp下载文件再输出到浏览器,对于小文件我们可以一次性读到memorystream,然后输出;但是大文件这样实现就会导致服务器内存爆炸,此时我们可以利用filestream,一边从ftp下载数据到本地,一边从本地输出到用户客户端,这样对于再大的文件都不会影响内存。
以下是通过异步的方式实现对下载文件同时进行读写操作的代码(.net framwork 4.5),MD5验证一致:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebApplication6
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        Aspose.Network.Ftp.FtpClient ftpclient = new Aspose.Network.Ftp.FtpClient("xxxx", "xxx", "xxx");

        protected void Page_Load(object sender, EventArgs e)
        {

        }
        string fileName = "C4F4EEP0CX00_ECN-52966A.exe";
        string downloadPath = string.Empty;
        string refilename = string.Empty;
        public async void DownLoadFileAsync()
        {
            string extension = Path.GetExtension(fileName);
            refilename = Path.GetFileNameWithoutExtension(fileName) + DateTime.Now.ToString("yyyyMMddHHmmssffff") + extension;
            downloadPath = Server.MapPath(Path.Combine("tempFile", refilename));
            try
            {
                ftpclient.Connect();
                ftpclient.Login();
                ftpclient.KeepAlive();
                //Task.Run()需要.net4.5及以上版本的支持
                await Task.Run(() => { ftpclient.Download("CLIENT_TMP//" + fileName, downloadPath); });

                //以下代码支持.net 4.0 ,但是需要额外在项目中加一个类TaskEx
                //await Task.Factory.StartNew(() => { ftpclient.Download("CLIENT_TMP//" + fileName, downloadPath); });
            }
            catch
            {
                throw;
            }
            finally
            {
                ftpclient.Disconnect();
            }
        }

        //要使用异步,页面配置头需要加Async="true" 
        //<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApplication6.WebForm1" Async="true" %>       
        protected void Button1_Click(object sender, EventArgs e)
        {
            try
            {
                //异步从ftp下载文件到web服务器本地文件夹
                DownLoadFileAsync();
                Response.Clear();//清空缓冲区
                Response.Buffer = false;//不从缓冲区返回数据
                Response.ContentType = "application/ctet-stream";//设置输出流
                Response.AddHeader("Content-Disposition", "attachment;  filename=" + fileName + ";");
                Response.AddHeader("Connection", "Keep-Alive");//长连接
                Thread.Sleep(2000);//等待异步创建文件成功,避免fileStream初始化失败
                //FileAccess.Read表示当前流只能读,不能写,如果后续有写操作会报错
                //FileShare.ReadWrite 表示当前流在操作磁盘文件过程中其他流可以读也可以写.
                using (FileStream fileStream = new FileStream(downloadPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                {
                    using (BinaryReader br = new BinaryReader(fileStream))
                    {
                        int length = 2048;
                        //获取br.BaseStream.Length时值会随着ftp下载而变化,每次获取都会更新
                        //br.ReadBytes()读取完后br.BaseStream.Position会前移.
                        while (br.BaseStream.Position < br.BaseStream.Length)
                        {
                            length = br.BaseStream.Length - br.BaseStream.Position > 2048 ? 2048 : (int)(br.BaseStream.Length - br.BaseStream.Position);
                            Response.BinaryWrite(br.ReadBytes(length));
                        }
                    }

                }
            }
            catch (Exception ex)
            {
                Response.Write($"<script>alert(''下载失败:{ex.Message}'')</script>");
            }
            finally
            {
                //下载完成后删除本地文件夹的文件
                try
                {
                    File.Delete(downloadPath);
                }
                catch
                {

                }
                Response.End();
            }

        }

    }
}

该文章在 2021/3/3 11:12:04 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2024 ClickSun All Rights Reserved