.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(),就可以把文件传到前端。这样就完成下载了。
有什么错误请多多指正,谢谢大家!~~~~
如有错误,欢迎指正,互相学习。谢谢!