突然發現又很久沒有寫博客了,想起哎呦,還是寫一篇博客記錄一下吧,雖然自己還是那個渣渣猿。
最近在做上傳文件的功能,上傳到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(),就可以把文件傳到前端。這樣就完成下載了。
有什么錯誤請多多指正,謝謝大家!~~~~