.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(),就可以把文件传到前端。这样就完成下载了。

有什么错误请多多指正,谢谢大家!~~~~

猜你喜欢

转载自www.cnblogs.com/Ivan-Wu/p/9723580.html