LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

asp.net從ftp下載大文件再輸出瀏覽器的實現(對文件同時進行讀寫操作)

admin
2021年3月3日 11:12 本文熱度 3753
很多時候安全起見,不會讓用戶通過瀏覽器直接從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-2025 ClickSun All Rights Reserved

黄频国产免费高清视频,久久不卡精品中文字幕一区,激情五月天AV电影在线观看,欧美国产韩国日本一区二区
亚洲日本中文字幕天天更新 | 中国精品国产yw在线观看 | 日本久久久久久久中文 | 亚洲欧美在线专区 | 亚洲欧美日韩久久精品第一区 | 午夜国语精品自产拍在线观看 |