using EntrustSettle.Common;
using EntrustSettle.Common.HttpContextUser;
using EntrustSettle.Controllers;
using EntrustSettle.IServices;
using EntrustSettle.Model;
using EntrustSettle.Model.Models;
using EntrustSettle.Model.Validator;
using FluentValidation;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.IdentityModel.Tokens;
using System.ComponentModel.DataAnnotations;
using System.IdentityModel.Tokens.Jwt;
using System.Net;
using System.Web;
namespace EntrustSettle.Api.Controllers
{
///
/// 附件
///
public class AnnexController : BaseApiController
{
private readonly IAnnexService annexService;
private readonly IOrderAnnexService orderAnnexService;
public AnnexController(IAnnexService annexService, IOrderAnnexService orderAnnexService)
{
this.annexService = annexService;
this.orderAnnexService = orderAnnexService;
}
///
/// 附件上传接口
///
/// 附件文件
/// 文件类型
[HttpPost]
public async Task> Upload([FromForm] IFormFile file,
[FromForm] FileTypeEnum fileType)
{
if (file == null)
{
return Failed("附件不能为空");
}
//new FileTypeEnumValidator().ValidateAndThrow(fileType);
// 文件目录
var dir = Path.Combine(App.WebHostEnvironment.WebRootPath, "files");
if (!Directory.Exists(dir))
{
Directory.CreateDirectory(dir);
}
// 文件名
var newFileName = Guid.NewGuid().ToString("N") + Path.GetExtension(file.FileName);
// 完整路径
var fullPath = Path.Combine(dir, newFileName);
// 保存
using (var stream = new FileStream(fullPath, FileMode.Create))
{
await file.CopyToAsync(stream);
}
// 保存文件信息到数据库
var model = new Annex()
{
Name = file.FileName,
Path = Path.Combine(@"files", newFileName),
Type = (int)fileType,
Key = Guid.NewGuid().ToString("N")
};
var annexId = await annexService.Add(model);
return Success(annexId);
}
///
/// 文件下载接口
///
/// 文件主键
[HttpGet]
public async Task DownloadFile([FromQuery] long annexId)
{
// 如果当前登陆人非本公司,判断要下载的文件所属订单是否属于登陆人所在公司
if (!App.User.CompanyName.Contains("东胜伟业") && !App.User.CompanyName.Contains("大简云"))
{
var compId = await orderAnnexService.AsQueryable()
.InnerJoin((an, o) => an.OrderId == o.Id)
.Where(an => an.AnnexId == annexId)
.Select((an, o) => o.CompanyId)
.FirstAsync();
if (compId != App.User.CompanyId)
{
throw new Exception("附件所属订单与登陆人不匹配");
}
}
var file = await annexService.QueryById(annexId);
if (file == null)
{
throw new FileNotFoundException("文件记录不存在");
}
var filePath = Path.Combine(App.WebHostEnvironment.WebRootPath, file.Path);
if (!System.IO.File.Exists(filePath))
{
throw new FileNotFoundException("文件不存在");
}
HttpContext.Response.Headers.TryAdd("Access-Control-Expose-Headers", "Content-Disposition");
// 读取filePath文件的内容,并返回给客户端
var p = HttpUtility.UrlEncode(file.Name, System.Text.Encoding.UTF8);
return PhysicalFile(filePath, "application/octet-stream", p);
}
///
/// 提供给外部的文件下载接口
///
[HttpGet]
[AllowAnonymous]
public async Task Download([Required][FromQuery] string key)
{
var file = await annexService.QueryFirst(x => x.Key == key);
if (file == null)
{
throw new FileNotFoundException("文件记录不存在");
}
var filePath = Path.Combine(App.WebHostEnvironment.WebRootPath, file.Path);
if (!System.IO.File.Exists(filePath))
{
throw new FileNotFoundException("文件不存在");
}
// 读取filePath文件的内容,并返回给客户端
var p = HttpUtility.UrlEncode(file.Name, System.Text.Encoding.UTF8);
var p2 = file.Name;
HttpContext.Response.Headers.TryAdd("Access-Control-Expose-Headers", "Content-Disposition");
return PhysicalFile(filePath, "application/octet-stream", p);
}
}
}