主要需求
实现图片上传API,并将图片访问路由信息返回。将文件的信息存储到数据库中,文件存在项目目录下(也可以在服务器中创建一个目录用来存放文件)
编写文件上传接口
public interface IuploadService{string upload(IFormFile formfile);}
public class UploadService : IuploadService{/*_env: IConfiguration_httpContextAccessor: IHttpContextAccessor*/public string upload(IFormFile formFile){// 首先将文件原本的名字改为按一定规律的数字编号(日期+时间+随机的八位数),作为文件ID使用,存储在数据库中Random ran = new Random(); // 实现随机string fileID = Convert.ToDateTime().ToString("yyyyMMddHHmmss") + ran.Next(999999999);// 获得图片的文件类型(jpg、png....)string sufix = formFile.FileName.Substring(formFile.FileName.LastIndexOf('.'));// 文件原本的名字string prefix = formFile.FileName.Substring(0,formFile.FileName.LastIndexOf('.'));// 文件上传之后分配到的名字(通过路径访问时,也是访问的这个)string fileName = fileID + sufix;// 文件上传后的存储路径var uploadPath = bine(_env.ContentRootPath + "/StaticFiles",fileName);// 访问路径(动态获取IP和端口号)string address = string.Empty;// 获取ipforeach (IPAddress _IPAddress in Dns.GetHostEntry(Dns.GetHostName()).AddressList){if (_IPAddress.AddressFamily.ToString() == "InterNetwork")address = _IPAddress.ToString();}// 获取端口int port = _httpContextAccessor.HttpContext.Request.HttpContext.Connection.LocalPort;string url = "http://" + address + ":" + port;// 访问路径visitUri = bine(url + "/staticfile",fileName);// 通过IO写入到目标路径(uploadPath)using (var fileStream = new FileStream(uploadPath, FileMode.Create, FileAccess.Write)){formFile.CopyTo(fileStream);}return visitUri;}}
最后文件会保存控制层项目下的StaticFiles目录下
所有上传的文件最后都会在StaticFiles目录下,因为在Service中的uploadPath就是上传的存储路径
var uploadPath = bine(_env.ContentRootPath + "/StaticFiles",fileName);
注意
如果要将代码运行,需要先在指定的位置先创建好StaticFiles目录。要是上传到IIS中则需要在publish中创建StaticFiles文件目录
上传完毕的图片需要通过设置的访问路径进行访问预览
如果直接输入设置的访问路径可能并不会成功访问,需要在Startup类中的Configure方法设置静态文件的访问。
app.UseStaticFiles(new StaticFileOptions{FileProvider = new PhysicalFileProvider(bine(Directory.GetCurrentDirectory(), "StaticFiles"))});