突然发现又很久没有写博客了,想起哎呦,还是写一篇博客记录一下吧,虽然自己还是那个渣渣猿。
最近在做上传文件的功能,上传到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 = ;
byte[] b = new byte[BufferLength];
fs.Seek(, SeekOrigin.Begin);
int i;
while ((i = fs.Read(b, , BufferLength)) > )
{
fsftp.Write(b, , 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 = ;
int readCount;
byte[] buffer = new byte[bufferSize];
readCount = ftpStream.Read(buffer, , bufferSize);
while (readCount > )
{
outputStream.Write(buffer, , readCount);
readCount = ftpStream.Read(buffer, , bufferSize);
} byte[] file = new byte[outputStream.Length * ];
file = outputStream.GetBuffer(); ftpStream.Close();
outputStream.Close();
response.Close(); return file;
}
这里参数fileName是服务器上的文件名,这里为什么要用byte数组类型的,控制器调用之后返回的数据存在数组中,调用return File(),就可以把文件传到前端。这样就完成下载了。
有什么错误请多多指正,谢谢大家!~~~~