以下范例中并未异常捕捉,实际应该捕捉异常。并且项目中我是把文件的详细信息在上传时放到了数据库中,然后下载和删除时从数据库中获取到文件信息,然后去服务器中操作。如有需要,可自行变换。
一、文件上传
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Renci.SshNet;
namespace WeCharGroupTest.Controllers
{
[Route("api/[controller]/[action]")]
[ApiController]
public class FilesMaintainController : ControllerBase
{
/// <summary>
/// 上传文件
/// </summary>
/// <param name="file">文件</param>
/// <param name="uploadName">上传人</param>
/// <param name="fileClass">父文件夹</param>
/// <returns></returns>
[HttpPost("Post_File")]
public async Task<string> Post_File(IFormFile file, string uploadName, string fileClass)
{
if(file != null)
{
string FileName = file.FileName;//文件名
long FileSize = file.Length;//文件大小
string FilePath = "/" + fileClass + "/" +DateTime.Now.ToString("yyyyMM") + "/";//以月份命名文件夹
string FileNewName = DateTime.Now.ToString("yyyy-MM-ss-HH:mm:ss") + "-" + FileName ;
string FileFullName = FilePath + FileNewName;//完整路径
using (SftpClient sftpclient = new SftpClient("真实ip", 端口号, "imas", "imas"))
{
sftpclient.Connect();
if (!sftpclient.Exists("/" + fileClass + "/"))
{
sftpclient.CreateDirectory("/" + fileClass + "/");//如果不存在目录,则创建。不支持创建多级目录
}
if (!sftpclient.Exists(FilePath))
{
sftpclient.CreateDirectory(FilePath);//如果不存在目录,则创建
}
MemoryStream ms = new MemoryStream();
file.CopyTo(ms);//把file赋给fs
sftpclient.BufferSize = 1024 * 1024 * 20;//设置客户端的缓冲区大小20M
ms.Seek(0, SeekOrigin.Begin);//将Position设置为0,即流的开始位置。
sftpclient.UploadFile(ms, FileFullName);
ms.Dispose();//释放ms
}
return "上传成功";
}
else
{
return "文件为空";
}
}
}
}
二、文件下载
/// <summary>
/// 下载文件
/// </summary>
/// <param name="FileFullPath">文件完整路径,如/mainTest/202409/2024-09-55-14:22:55-西瓜.jpeg</param>
/// <param name="FileName">文件名称,如2024-09-55-14:22:55-西瓜.jpeg</param>
/// <returns></returns>
[HttpGet("DownLoad_File")]
public FileContentResult DownLoad_File(string FileFullPath, string FileName)
{
byte[] buffer = new byte[0];
if (FileFullPath != null)
{
using (var client = new SftpClient("ip", 端口号, "imas", "imas")) //创建连接对象
{
client.Connect(); //连接
buffer = client.ReadAllBytes(FileFullPath);
}
}
return File(buffer, System.Net.Mime.MediaTypeNames.Application.Octet, FileName);
}
三、文件删除
/// <summary>
/// 删除文件
/// </summary>
/// <param name="FileFullPath">文件完整路径,如/mainTest/202409/2024-09-55-14:22:55-西瓜.jpeg</param>
/// <returns></returns>
[HttpDelete("Delete_File")]
public string Delete_File(string FileFullPath)
{
if (FileFullPath != null)
{
using (var client = new SftpClient("服务器ip", 端口号, "imas", "imas")) //创建连接对象
{
client.Connect(); //连接
client.DeleteFile(FileFullPath);
}
return "删除成功";
}
else
{
return "请检查文件地址";
}
}