using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using GxPress.Auth;
using GxPress.Common.Exceptions;
using GxPress.Common.Tools;
using GxPress.Entity;
using GxPress.Repository.Interface;
using GxPress.Request.App.FileLibrary;
using GxPress.Result.App.FileLibrary;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using GxPress.Service.Interface.FileLibrary;
using GxPress.Repository.Interface.VerificationCode;
using Datory;
namespace GxPress.Api.AppControllers
{
[Route("api/app/file")]
[ApiController]
[Authorize]
public class FileController : ControllerBase
{
private readonly IWebHostEnvironment _environment;
private readonly IFileLibraryRepository _fileLibraryRepository;
private readonly IFileLibraryService fileLibraryService;
private readonly ILoginContext _loginContext;
private readonly IVerificationCodeRepository verificationCodeRepository;
public FileController(IWebHostEnvironment environment, IFileLibraryRepository fileLibraryRepository, ILoginContext loginContext, IFileLibraryService fileLibraryService, IVerificationCodeRepository verificationCodeRepository)
{
_environment = environment;
_fileLibraryRepository = fileLibraryRepository;
_loginContext = loginContext;
this.fileLibraryService = fileLibraryService;
this.verificationCodeRepository = verificationCodeRepository;
}
///
/// App上传
///
///
///
[AllowAnonymous]
[HttpPost("upload")]
public async Task Upload(IFormFile file)
{
if (file == null) throw new BusinessException("请选择需要上传的文件");
byte[] bytes;
await using (var ms = new MemoryStream())
{
file.CopyTo(ms);
bytes = ms.ToArray();
}
var saveResult = FileHelper.SaveFile(StringUtils.GetWebRootPath(_environment.WebRootPath), file.FileName,
bytes);
saveResult.AbsolutePath = Request.Scheme + "://" + Request.Host.Host +
(Request.Host.Port > 0 ? $":{Request.Host.Port}" : string.Empty) +
saveResult.RelativePath;
saveResult.FileName = file.FileName;
saveResult.FileType = saveResult.FileName.Split('.')[saveResult.FileName.Split('.').Length - 1];
//图片种类
string imageType =
"bmp,jpg,jpeg,png,tif,gif,pcx,tga,exif,fpx,svg,psd,cdr,pcd,dxf,ufo,eps,ai,raw,wmf,webp";
var imageTypeList = StringUtils.StringCollectionToStringList(imageType);
if (imageTypeList.Contains(saveResult.FileType.ToLower()))
{
saveResult.FileType = "image";
saveResult.MinAbsolutePath = StringUtils.AddDomainMin(saveResult.RelativePath);
}
//添加
var fileLibrary = new FileLibrary
{
FileName = saveResult.FileName,
FileType = saveResult.FileType,
FileUrl = saveResult.RelativePath,
UserId = 0,
Size = file.Length
};
saveResult.Size = file.Length;
saveResult.FileId = await fileLibraryService.InsertAsync(fileLibrary);
return saveResult;
}
///
/// App多文件上传
///
///
///
[HttpPost("uploads")]
[AllowAnonymous]
public async Task> Uploads(List file)
{
if (file == null) throw new BusinessException("请选择需要上传的文件");
List result = new List();
foreach (var item in file)
{
byte[] bytes;
await using (var ms = new MemoryStream())
{
item.CopyTo(ms);
bytes = ms.ToArray();
}
var saveResult = FileHelper.SaveFile(StringUtils.GetWebRootPath(_environment.WebRootPath), item.FileName,
bytes);
saveResult.AbsolutePath = Request.Scheme + "://" + Request.Host.Host +
(Request.Host.Port > 0 ? $":{Request.Host.Port}" : string.Empty) +
saveResult.RelativePath;
saveResult.FileName = item.FileName;
saveResult.FileType = item.FileName.Split('.')[item.FileName.Split('.').Length - 1];
//图片种类
string imageType =
"bmp,jpg,jpeg,png,tif,gif,pcx,tga,exif,fpx,svg,psd,cdr,pcd,dxf,ufo,eps,ai,raw,wmf,webp";
var imageTypeList = StringUtils.StringCollectionToStringList(imageType);
if (imageTypeList.Contains(saveResult.FileType.ToLower()))
{
saveResult.MinAbsolutePath = StringUtils.AddDomainMin(saveResult.RelativePath);
if (saveResult.FileType.ToLower() == "webp")
saveResult = Common.Tools.FileHelper.WebPToImage(StringUtils.GetWebRootPath(_environment.WebRootPath), item.FileName,saveResult,Request.Scheme + "://" + Request.Host.Host +
(Request.Host.Port > 0 ? $":{Request.Host.Port}" : string.Empty));
saveResult.FileType = "image";
}
//添加
var fileLibrary = new FileLibrary
{
FileName = saveResult.FileName,
FileType = saveResult.FileType,
FileUrl = saveResult.RelativePath,
UserId = 0,
Size = item.Length
};
saveResult.Size = item.Length;
saveResult.FileId = await _fileLibraryRepository.InsertAsync(fileLibrary);
result.Add(saveResult);
}
return result;
}
///
/// 根据ID查询文件数据
///
///
///
[HttpGet("{id}")]
public async Task GetFileLibraryById(int id)
{
return await _fileLibraryRepository.GetFileLibraryByIdAsync(id);
}
///
/// 根据ID获取文件数据
///
///
///
[HttpPost("find")]
public async Task> GetFileLibraryByIds([FromBody] GetFileLibraryByIdsRequest ids)
{
return await _fileLibraryRepository.GetFileLibraryByIdsAsync(ids.FileLibraryByIds);
}
///
/// App多文件上传
///
///
///
///
[HttpPost("upload-files")]
[AllowAnonymous]
public async Task> UploadFiles(List file, [FromForm] string code)
{
if (string.IsNullOrWhiteSpace(code))
throw new BusinessException("code无效或为空值");
if (file == null) throw new BusinessException("请选择需要上传的文件");
//获取verificationCode
var verificationCode = await verificationCodeRepository.GetAsync(Q.Where(nameof(Entity.VerificationCode.VerificationCode.Code), code).OrderByDesc(nameof(Entity.VerificationCode.VerificationCode.CreatedDate)));
if (verificationCode == null)
throw new BusinessException("验证码无效");
var verificationCodeTime = Convert.ToDateTime(verificationCode.CreatedDate).AddMinutes(verificationCode.ExpireTime);
if (verificationCodeTime < DateTime.Now)
throw new BusinessException("验证码已经过期");
List result = new List();
foreach (var item in file)
{
byte[] bytes;
await using (var ms = new MemoryStream())
{
item.CopyTo(ms);
bytes = ms.ToArray();
}
var saveResult = FileHelper.SaveFile(StringUtils.GetWebRootPath(_environment.WebRootPath), item.FileName,
bytes);
saveResult.AbsolutePath = Request.Scheme + "://" + Request.Host.Host +
(Request.Host.Port > 0 ? $":{Request.Host.Port}" : string.Empty) +
saveResult.RelativePath;
saveResult.FileName = item.FileName;
saveResult.FileType = item.FileName.Split('.')[item.FileName.Split('.').Length - 1];
//图片种类
string imageType =
"bmp,jpg,jpeg,png,tif,gif,pcx,tga,exif,fpx,svg,psd,cdr,pcd,dxf,ufo,eps,ai,raw,wmf,webp";
var imageTypeList = StringUtils.StringCollectionToStringList(imageType);
if (imageTypeList.Contains(saveResult.FileType.ToLower()))
{
saveResult.FileType = "image";
saveResult.MinAbsolutePath = StringUtils.AddDomainMin(saveResult.RelativePath);
}
//
//添加
var fileLibrary = new FileLibrary
{
FileName = saveResult.FileName,
FileType = saveResult.FileType,
FileUrl = saveResult.RelativePath,
UserId = verificationCode.UserId,
Size = item.Length
};
saveResult.Size = item.Length;
saveResult.FileId = await fileLibraryService.InsertAsync(fileLibrary);
result.Add(saveResult);
}
return result;
}
}
}