Image 上传下载Api
1.配置
"UploadConfig": {
// 自定义存放位置,无需放到站点内部
"Path": "C:\\Users\\kxy\\Desktop\\images\\Upload",
// 配置id对应的子目录
"Items": [
{
"id": "CeshiImg",
"path": "CeshiImg"
}
]
}
定义类,用来接住配置
public class UploadConfig
{
public string Path { get; set; }
public List<Item> Items { get; set; }
}
public class Item
{
public string id { get; set; }
public string path { get; set; }
}
读取配置,需要在 Startup 的 ConfigureServices 添加
services.AddOptions();
services.Configure<UploadConfig>(Configuration.GetSection("UploadConfig"));
2.接口
[Route("api/[controller]")]
[ApiController]
public class UploadController : ControllerBase
{
UploadConfig configs = null;
public UploadController(IOptions<UploadConfig> option)//构造函数
{
configs = option.Value;
}
/// <summary>
/// 上传文件
/// </summary>
/// <param name="id">子目录id</param>
/// <param name="files">文件</param>
/// <returns></returns>
[HttpPost("{id}")]
public async Task<IActionResult> File(string id, [FromForm]List<IFormFile> files)
{
if (!SuccessConfig(id))
return Ok(new { Msg = "配置信息不存在" });
var con = configs.Items.Find(p => p.id == id);
// 保存文件夹
var saveFolder = Path.Combine(configs.Path, con.path);
if (!Directory.Exists(saveFolder))
Directory.CreateDirectory(saveFolder);
var LPath = new List<string>();
try
{
foreach (var file in files)
{
// 相对路径
var relaPath = Path.Combine(con.path, RanFileNo(id) + "." + GetFileSuf(file.FileName));
using (var stream = new FileStream(Path.Combine(configs.Path, relaPath), FileMode.Create))
{
await file.CopyToAsync(stream);
}
LPath.Add(relaPath);
}
}
catch (Exception ex)
{
throw ex;
}
return Ok(new { count = files.Count, LPath });
}
/// <summary>
/// 获取文件流
/// </summary>
/// <param name="relaPath">相对路径</param>
/// <returns></returns>
[HttpGet("Get")]
public async Task<IActionResult> Get([FromQuery]string relaPath)
{
var image = System.IO.File.OpenRead(Path.Combine(configs.Path,relaPath));
return File(image, "image/jpeg");
}
/// <summary>
/// 检查配置
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
private bool SuccessConfig(string id)
{
if (configs == null || configs.Path == "" || configs.Path == null || configs.Items == null)
return false;
var con = configs.Items.Find(p => p.id == id);
if (con == null || con.path == "" || con.path == "")
return false;
return true;
}
/// <summary>
/// 获取随机路径
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
private string RanFileNo(string id)
{
return id + "_" + DateTime.Now.ToString("yyyyMMddHHmmss") + "_" + (new Random(Guid.NewGuid().GetHashCode())).Next(, ).ToString();
}
/// <summary>
/// 获取文件后缀
/// </summary>
/// <param name="filename"></param>
/// <returns></returns>
private string GetFileSuf(string filename)
{
var le = filename.Split('.').Length;
if (le == )
throw new Exception("获取文件名后缀失败");
return filename.Split('.')[le - ];
}
}
3.Postman 调用接口
1)上传

2)获取

Image 上传下载Api的更多相关文章
- asp.net 模拟CURL调用微信公共平台API 上传下载多媒体文
近公司项目上在开发微信服务号的接口,需要给用户回复图片或语音或视频,这个时候就需要用到 上传下载多媒体文件接口,微信在这方面推荐采用的是开源函数库curl实现的,CURL项目包括很多版本,我主要测试的 ...
- asp.net 模拟CURL调用微信公共平台API 上传下载多媒体文件接口
FormItem类 public class FormItem { public string Name { get; set; } public ParamType ParamType { get; ...
- 使用pcs api往免费的百度网盘上传下载文件
百度个人云盘空间大,完全免费,而且提供了pcs api供调用操作文件,在平时的项目里往里面保存一些文件是很实用的. 环境准备: 开通读写网盘的权限及获取access_token:http://blog ...
- 简单Excel表格上传下载,POI
一.废话 Excel表格是office软件中的一员,几乎是使用次数最多的办公软件.所以在java进行企业级应用开发的时候经常会用到对应的上传下载便利办公. 目前,比较常用的实现Java导入.导出Exc ...
- JAVA 实现FTP上传下载(sun.net.ftp.FtpClient)
package com.why.ftp; import java.io.DataInputStream; import java.io.File; import java.io.FileInputSt ...
- C#微信公众号开发系列教程六(被动回复与上传下载多媒体文件)
微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) C#微信公众号开发系列教程三(消息体签名及加解密) C ...
- FTP客户端上传下载Demo实现
1.第一次感觉MS也有这么难用的MFC类: 2.CFtpFileFind类只能实例化一个,多个实例同时查找会出错(因此下载时不能递归),采用队列存储目录再依次下载: 3.本程序支持文件夹嵌套上传下载: ...
- JAVA实现上传下载共享文件
1.上传下载共享文件需要用到jcifs,先下载相关JAR包(开源项目的源码,demo,文挡.API应有尽有) https://jcifs.samba.org/src/
- java web 文件上传下载
文件上传下载案例: 首先是此案例工程的目录结构:
随机推荐
- 使用try-with-resources优雅的关闭IO流
Java类库中包括许多必须通过调用close方法来手工关闭的资源.例如InputStream.OutputStream和java.sql.Connection.客户端经常会忽略资源的关闭,造成严重的性 ...
- Generetor函数与线程之间的思考
在解析这个问题之前,首先,我们来了解一下es6标准里新增解决异步的两种规范 Promise与Generetor Promise 其实Promise的本质 还是基于js程式的回调处理----这一点看它的 ...
- open live writer 测试
什么是Hash表 1.定义 Hash(散列/哈希),就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值.这种转换是一种压缩映射,也就是,散 ...
- MySQL中怎么对varchar类型排序问题(转)
在mysql默认order by 只对数字与日期类型可以排序,但对于varchar字符型类型排序好像没有用了,下面我来给各位同学介绍varchar类型排序问题如何解决. 今天在对国家电话号码表进行 ...
- iptables对端口流量统计
本篇文章主要介绍了Linux下如何对端口流量进行统计,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 在不修改源代码的情况下对程序暴露端口流量进行监控统计,可以利用Li ...
- bugku crypto easy-crypto
长度不一的01字符串 就要考虑是不是摩斯密码 用这个py脚本: from __future__ import print_function a = input("input the stri ...
- ansible命令
ansible 默认提供了很多模块来供我们使用.在 Linux 中,我们可以通过 ansible-doc -l 命令查看到当前 ansible 都支持哪些模块,通过 ansible-doc -s ...
- Android P添加一个可以让system_server进程访问的hal service需要改动的sepolicy文件
在device/sepolicy/common目录中: 修改文件attributes: attribute hal_newXX;attribute hal_newXX_client;attribute ...
- [数据库] windows server 2003下mysql出现10048错误的解决办法 Can't connect to MySQL server on '127.0.0.1' (10048)(抄)
网站访问量大了的时候mysql连接数自然就多了,当超出mysql最大连接数的时候就会出现错误,当出现too many字样的错误的时候一般是因为连接数的问题,只需要修改最大连接数max_conectio ...
- WC2019冬眠记
Day0 报道日就当做Day0吧. 上午起床比较晚,起来就开始整理东西准备搬到广二的高中部去,搬了两趟,因为没吃早饭,头就很晕,吓得我赶快把之前发的士力架给吃了. 上午李姐姐和我们聊了聊\(THUWC ...