一、控制器代码
/// <summary>
///上传图片到服务器,调用后台管理的上传图片接口
/// </summary>
/// <param name="files">表单文件信息</param>
/// <returns></returns>
[HttpPost("UploadImage")]
[AllowAnonymous]
public IActionResult UploadImage(IFormFile files)
{
try
{
if (files.Length <= 0)
{
return Ok(new { Code = 400, Msg = "请选择要上传的图片!" });
}
var fileBytes = ReadFileBytes(files);
var fileExtension = Path.GetExtension(files.FileName);//获取文件格式,拓展名
var result = HttpClientHelper._.HttpClientPost("上传图片URL", fileBytes, fileExtension, files.FileName);
var resultObj = JsonConvert.DeserializeObject<UploadResult>(result);
if (resultObj != null)
{
if (resultObj.code == 200)
{
return Ok(new { Code = resultObj.code, Msg = resultObj.Msg, ImgUrl = resultObj.data, ImgName = resultObj.imgname });
}
else
{
return Ok(new { code = 400, msg = resultObj.Msg });
}
}
else
{
return Ok(new { code = 400, msg ="上传失败!"});
}
}
catch (Exception e)
{
return Ok(new { code = 400, msg = e.Message });
}
}
/// <summary>
/// 文件流类型转化字节类型
/// </summary>
/// <param name="fileData">表单文件信息</param>
/// <returns></returns>
private byte[] ReadFileBytes(IFormFile fileData)
{
byte[] data;
using (Stream inputStream = fileData.OpenReadStream())//读取上传文件的请求流
{
MemoryStream memoryStream = inputStream as MemoryStream;
if (memoryStream == null)
{
memoryStream = new MemoryStream();
inputStream.CopyTo(memoryStream);
}
data = memoryStream.ToArray();
}
return data;
}
二、新建返回结果类UploadResult
/// <summary>
/// 上传响应模型
/// </summary>
public class UploadResult
{
/// <summary>
/// code
/// </summary>
public int code { get; set; }
/// <summary>
/// 结果
/// </summary>
public string Msg { get; set; }
/// <summary>
/// 图片地址
/// </summary>
public string data { get; set; }
/// <summary>
/// 图片名称
/// </summary>
public string imgname { get; set; }
}
三、新建Http网络请求帮助类HttpClientHelper
public class HttpClientHelper
{
private static HttpClientHelper _httpClientHelper;
public static HttpClientHelper _
{
get => _httpClientHelper ?? (_httpClientHelper = new HttpClientHelper());
set => _httpClientHelper = value;
}
/// <summary>
/// 向目标地址提交图片文件参数数据
/// </summary>
/// <param name="requestUrl">请求地址</param>
/// <param name="bmpBytes">图片字节流</param>
/// <param name="imgType">上传图片类型</param>
/// <param name="fileName">图片名称</param>
/// <returns></returns>
public string HttpClientPost(string requestUrl, byte[] bmpBytes, string imgType, string fileName)
{
using (var httpClient = new HttpClient())
{
List<ByteArrayContent> byteArrayContents = new List<ByteArrayContent>();
var imgTypeContent = new ByteArrayContent(Encoding.UTF8.GetBytes(imgType));
imgTypeContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
{
Name = "imgType"
};
byteArrayContents.Add(imgTypeContent);
var fileContent = new ByteArrayContent(bmpBytes);//填充图片文件二进制字节
fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
{
Name = "file",
FileName = fileName
};
byteArrayContents.Add(fileContent);
var content = new MultipartFormDataContent();
//将ByteArrayContent集合加入到MultipartFormDataContent中
foreach (var byteArrayContent in byteArrayContents)
{
content.Add(byteArrayContent);
}
try
{
var result = httpClient.PostAsync(requestUrl, content).Result;//post请求
return result.Content.ReadAsStringAsync().Result;
}
catch (Exception ex)
{
return ex.Message;
}
}
}
}
四、调用的接口
[HttpPost("UploadImage")]
public IActionResult UploadImage([FromForm] IFormCollection formData)
{
try
{
var files = Request.Form.Files;
if (files.Count == 0)
{
return new JsonResult(new { code = 400, Msg = "没有选择的图片!" });
}
var file = files[0];
string fileName = file.FileName;
if (string.IsNullOrEmpty(fileName))//服务器是否存在该文件
{
return new JsonResult(new { code = 400, Msg = "服务器上已存在该图片!" });
}
// 获取上传的图片名称和扩展名称
string fileFullName = Path.GetFileName(file.FileName);
string fileExtName = Path.GetExtension(fileFullName);
var fileExtNames = Configuration["UploadImgURL:FileExtName"].ToString().Split(',');
if (!fileExtNames.Contains(fileExtName))
{
return new JsonResult(new { code = 400, Msg = "选择的文件不是图片的格式!"});
}
//获取当前项目所在的路径
string imgPath = Configuration["UploadImgURL:ImgURLAPI"];
//生成随机数
Random rd = new Random();
int num = rd.Next(1000, 10000);
var newPath = "LKImages" + num + System.DateTime.UtcNow.Ticks + fileExtName;
var src = imgPath + newPath;
// 如果目录不存在则要先创建
if (!Directory.Exists(imgPath))
{
Directory.CreateDirectory(imgPath);
}
using (FileStream fs = System.IO.File.Create(src))
{
file.CopyTo(fs);
fs.Flush();
}
string PathSrc = Configuration["UploadImgURL:ImgURL"] + newPath;
return new JsonResult(new { code = 200, data = PathSrc, imgname = newPath, Msg = "上传成功!" });
}
catch (Exception e)
{
return new JsonResult(new { code = 400, Msg = "上传失败!"+e.Message });
}
}
appsettings.json配置代码
//上传图片路径
"UploadImgURL": {
"ImgURLAPI": "wwwroot/UploadFile/ApiImages/",
"FileExtName": ".jpg,.png,.bmp",
"ImgURL": "/UploadFile/ApiImages/"
}