.Net 上傳文件到ftp服務器和下載文件


突然發現又很久沒有寫博客了,想起哎呦,還是寫一篇博客記錄一下吧,雖然自己還是那個渣渣猿。

最近在做上傳文件的功能,上傳到ftp文件服務器有利於管理上傳文件。

前面的博客有寫到layui如何上傳文件,然后控制器用IFormFile去接收,那么我們為了消除代碼的重復,我們可以建一個公共類,這樣就可以重用了。

其實上傳很簡單,用一個帶有IFormFile參數的函數封裝就OK了,如下:

        /// <summary>
        /// 上傳文件到ftp服務器上
        /// </summary>
        /// <param name="file">文件</param>
        /// <param name="dateStr">文件時間戳</param>
        /// <returns>bool</returns>
        public static bool UploadFile(IFormFile file, long dateStr)
        {
            bool result = false;
            using (MemoryStream fs = new MemoryStream())
            {
                file.CopyTo(fs);
                long length = fs.Length;
                FtpWebRequest ftpReq = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpAddress + dateStr.ToString() + "_" + file.FileName));
                ftpReq.Credentials = new NetworkCredential(ftpUser, ftpPwd);  //默認為true,連接不會關閉,設置為false,執行之后關閉連接
                ftpReq.KeepAlive = false;
                ftpReq.Method = WebRequestMethods.Ftp.UploadFile;
                ftpReq.UseBinary = true;
                using (Stream fsftp = ftpReq.GetRequestStream())
                {
                    //設置緩沖大小
                    int BufferLength = 5120;
                    byte[] b = new byte[BufferLength];
                    fs.Seek(0, SeekOrigin.Begin);
                    int i;
                    while ((i = fs.Read(b, 0, BufferLength)) > 0)
                    {
                        fsftp.Write(b, 0, i);
                    }

                    result = true;
                }
            }

            return result;
        }

這里定義了一個IFormFile用於傳入文件,並用MemoryStream 寫入到ftp服務器文件中,這里必須注意的是一定要加 fs.seek(0, SeekOrgin.Begin),這樣byte數組才能從MemoryStream 讀取到流。

然后就是從ftp服務器上下載文件了,這里也用一個byte數組類型的方法去封裝,如下:

        /// <summary>
        /// 下載附件
        /// </summary>
        /// <param name="fileName">附件名</param>
        /// <returns>byte[]</returns>
        public static byte[] DownloadFile(string fileName)
        {
            MemoryStream outputStream = new MemoryStream();

            FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpAddress + fileName));

            reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
            reqFTP.UseBinary = true;
            reqFTP.UsePassive = false;
            reqFTP.Credentials = new NetworkCredential(ftpUser, ftpPwd);
            FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
            Stream ftpStream = response.GetResponseStream();
            long cl = response.ContentLength;
            int bufferSize = 2048;
            int readCount;
            byte[] buffer = new byte[bufferSize];
            readCount = ftpStream.Read(buffer, 0, bufferSize);
            while (readCount > 0)
            {
                outputStream.Write(buffer, 0, readCount);
                readCount = ftpStream.Read(buffer, 0, bufferSize);
            }

            byte[] file = new byte[outputStream.Length * 2];
            file = outputStream.GetBuffer();

            ftpStream.Close();
            outputStream.Close();
            response.Close();

            return file;
        }

這里參數fileName是服務器上的文件名,這里為什么要用byte數組類型的,控制器調用之后返回的數據存在數組中,調用return File(),就可以把文件傳到前端。這樣就完成下載了。

有什么錯誤請多多指正,謝謝大家!~~~~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM