732 lines
26 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using Learun.Cache.Base;
using Learun.Cache.Factory;
using Learun.Util;
using Learun.Util.SqlSugar;
namespace Learun.Application.Base.SystemModule
{
/// <summary>
/// 版 本 PIT-ADMS V7.0.3 敏捷开发框架
/// Copyright (c) 2013-2018 Hexagon PPM
/// 创建人:研发部
/// 日 期2017.03.08
/// 描 述:附件管理
/// </summary>
public class AnnexesFileBLL : AnnexesFileIBLL
{
AnnexesFileService annexesFileService = new AnnexesFileService();
/*缓存文件分片信息*/
private ICache cache = CacheFactory.CaChe();
private string cacheKey = "learun_adms_annexes_";
#region
/// <summary>
/// 获取实体列表
/// </summary>
/// <param name="keyValue">附件夹主键</param>
/// <returns></returns>
public List<AnnexesFileEntity> GetList(string folderId)
{
try
{
return annexesFileService.GetList(folderId);
}
catch (Exception ex)
{
if (ex is ExceptionEx)
{
throw;
}
else
{
throw ExceptionEx.ThrowBusinessException(ex);
}
}
}
/// <summary>
/// 获取附件名称集合
/// </summary>
/// <param name="keyValue">主键值</param>
/// <returns></returns>
public string GetFileNames(string keyValue)
{
try
{
return annexesFileService.GetFileNames(keyValue);
}
catch (Exception ex)
{
if (ex is ExceptionEx)
{
throw;
}
else
{
throw ExceptionEx.ThrowBusinessException(ex);
}
}
}
/// <summary>
/// 获取附件实体
/// </summary>
/// <param name="keyValue">主键</param>
/// <returns></returns>
public AnnexesFileEntity GetEntity(string keyValue)
{
try
{
AnnexesFileEntity entity = annexesFileService.GetEntity(keyValue);
return entity;
}
catch (Exception ex)
{
if (ex is ExceptionEx)
{
throw;
}
else
{
throw ExceptionEx.ThrowBusinessException(ex);
}
}
}
/// <summary>
/// 获取附件
/// </summary>
/// <param name="keyValue">主键</param>
/// <returns></returns>
public List<AnnexesFileEntity> GetEntitys(string keyValue)
{
try
{
return annexesFileService.GetEntitys(keyValue);
}
catch (Exception ex)
{
if (ex is ExceptionEx)
{
throw;
}
else
{
throw ExceptionEx.ThrowBusinessException(ex);
}
}
}
/// <summary>
/// 根据附件id获取文件
/// </summary>
/// <param name="folderId"></param>
/// <returns></returns>
public AnnexesFileEntity GetByfolderIdEntity(string folderId)
{
try
{
return annexesFileService.GetByfolderIdEntity(folderId);
}
catch (Exception ex)
{
if (ex is ExceptionEx)
{
throw;
}
else
{
throw ExceptionEx.ThrowBusinessException(ex);
}
}
}
/// <summary>
/// 获取实体(根据F_Id)
/// </summary>
/// <param name="F_Id">主键</param>
/// <returns></returns>
public AnnexesFileEntity GetEntityByF_Id(string F_Id)
{
try
{
return annexesFileService.GetEntityByF_Id(F_Id);
}
catch (Exception ex)
{
if (ex is ExceptionEx)
{
throw;
}
else
{
throw ExceptionEx.ThrowBusinessException(ex);
}
}
}
/// <summary>
/// 获取页面显示列表数据
/// </summary>
/// <param name="pagination">分页信息</param>
/// <param name="queryJson">查询参数</param>
/// <returns></returns>
public List<AnnexesFileEntity> GetPageList(Pagination pagination, string queryJson)
{
try
{
return annexesFileService.GetPageList(pagination, queryJson);
}
catch (Exception ex)
{
if (ex is ExceptionEx)
{
throw;
}
else
{
throw ExceptionEx.ThrowBusinessException(ex);
}
}
}
#endregion
#region
/// <summary>
/// 保存数据实体
/// </summary>
/// <param name="folderId">附件夹主键</param>
/// <param name="annexesFileEntity">附件实体数据</param>
public void SaveEntity(string folderId, AnnexesFileEntity annexesFileEntity)
{
try
{
annexesFileService.SaveEntity(folderId, annexesFileEntity);
}
catch (Exception ex)
{
if (ex is ExceptionEx)
{
throw;
}
else
{
throw ExceptionEx.ThrowBusinessException(ex);
}
}
}
/// <summary>
/// 修改实体
/// </summary>
public void EditEntity(AnnexesFileEntity annexesFileEntity)
{
try
{
annexesFileService.EditEntity(annexesFileEntity);
}
catch (Exception ex)
{
if (ex is ExceptionEx)
{
throw;
}
else
{
throw ExceptionEx.ThrowBusinessException(ex);
}
}
}
/// <summary>
/// 删除附件
/// </summary>
/// <param name="fileId">文件主键</param>
public void DeleteEntity(string fileId)
{
try
{
annexesFileService.DeleteEntity(fileId);
}
catch (Exception ex)
{
if (ex is ExceptionEx)
{
throw;
}
else
{
throw ExceptionEx.ThrowBusinessException(ex);
}
}
}
#endregion
#region
/// <summary>
/// 保存附件(文件流)
/// </summary>
/// <param name="folderId">附件夹主键</param>
/// <param name="fileGuid">文件主键</param>
/// <param name="fileName">文件名称</param>
/// <param name="fileSize">文件大小</param>
/// <param name="inputStream">文件流</param>
/// <param name="userInfo">用户信息</param>
/// <param name="filePath">保存路径</param>
/// <returns></returns>
public bool SaveAnnexes(string folderId, string fileGuid, string fileName, int fileSize, Stream inputStream, UserInfo userInfo, string filePath = "")
{
try
{
string virtualPath = "";
string uploadDate = DateTime.Now.ToString("yyyyMMdd");
string FileEextension = Path.GetExtension(fileName);
if (string.IsNullOrEmpty(filePath))
{
filePath = Config.GetValue("AnnexesFile");
virtualPath = string.Format("{0}/{1}/{2}/{3}{4}", filePath, userInfo.userId, uploadDate, fileGuid, FileEextension);
}
else
{
virtualPath = string.Format("{0}/{1}", filePath, fileName);
}
//创建文件夹
string path = Path.GetDirectoryName(virtualPath);
Directory.CreateDirectory(path);
AnnexesFileEntity fileAnnexesEntity = new AnnexesFileEntity();
if (!System.IO.File.Exists(virtualPath))
{
using (var fileStream = File.Create(virtualPath))
{
inputStream.Seek(0, SeekOrigin.Begin);
inputStream.CopyTo(fileStream);
}
string WebFileID = string.Empty;
string thumbnail = "";
string imageFormat = ".bmp,.jpg,.jpeg,.png,.gif";
string Eextension = FileEextension.ToLower();
//如果是图片则压缩
if (!string.IsNullOrEmpty(Eextension) && imageFormat.Contains(Eextension))
{
thumbnail = virtualPath.Substring(0, virtualPath.LastIndexOf(".")) + ".JPEG";
YaSuo(virtualPath, thumbnail, 10);
}
//文件信息写入数据库
fileAnnexesEntity.F_Id = fileGuid;
fileAnnexesEntity.F_FileName = fileName;
fileAnnexesEntity.F_FilePath = virtualPath;
fileAnnexesEntity.F_ThumbnailImgPath = thumbnail;
fileAnnexesEntity.F_FileSize = fileSize.ToString();
fileAnnexesEntity.F_FileExtensions = FileEextension;
fileAnnexesEntity.F_FileType = FileEextension.Replace(".", "");
fileAnnexesEntity.F_CreateUserId = userInfo.userId;
fileAnnexesEntity.F_CreateUserName = userInfo.realName;
fileAnnexesEntity.F_WebFileID = WebFileID;
SaveEntity(folderId, fileAnnexesEntity);
}
return true;
}
catch (Exception ex)
{
if (ex is ExceptionEx)
{
throw;
}
else
{
throw ExceptionEx.ThrowBusinessException(ex);
}
}
}
/// <summary>
/// 保存附件(支持大文件分片传输)
/// </summary>
/// <param name="folderId">附件夹主键</param>
/// <param name="fileGuid">文件主键</param>
/// <param name="fileName">文件名称</param>
/// <param name="chunks">文件总共分多少片</param>
/// <param name="userInfo">用户信息</param>
/// <param name="filePath">保存路径</param>
/// <returns></returns>
public bool SaveAnnexes(string folderId, string fileGuid, string fileName, int chunks, UserInfo userInfo, string filePath = "")
{
try
{
//获取文件完整文件名(包含绝对路径)
//文件存放路径格式:/Resource/ResourceFile/{userId}/{date}/{guid}.{后缀名}
string virtualPath = "";
string uploadDate = DateTime.Now.ToString("yyyyMMdd");
string FileEextension = Path.GetExtension(fileName);
if (string.IsNullOrEmpty(filePath))
{
filePath = Config.GetValue("AnnexesFile");
virtualPath = string.Format("{0}/{1}/{2}/{3}{4}", filePath, userInfo.userId, uploadDate, fileGuid, FileEextension);
}
else
{
virtualPath = string.Format("{0}/{1}", filePath, fileName);
}
//创建文件夹
string path = Path.GetDirectoryName(virtualPath);
Directory.CreateDirectory(path);
AnnexesFileEntity fileAnnexesEntity = new AnnexesFileEntity();
if (!System.IO.File.Exists(virtualPath))
{
long filesize = SaveAnnexesToFile(fileGuid, virtualPath, chunks);
if (filesize == -1)// 表示保存失败
{
RemoveChunkAnnexes(fileGuid, chunks);
return false;
}
//else
//{
// if (FileEextension == ".mp4")
// {
// string videoPath = Config.GetApplicationPath() + string.Format("Content/video/{0}{1}", fileGuid, FileEextension);
// videoPath.Replace('/', '\\');
// File.Copy(virtualPath, videoPath, true);
// int len = videoPath.LastIndexOf("Content");
// var videourl = "\\" + videoPath.Substring(len, videoPath.Length - len);
// videourl = videourl.Replace('\\', '/');
// virtualPath = videourl;
// }
//}
string WebFileID = string.Empty;
string thumbnail = "";
string imageFormat = ".bmp,.jpg,.jpeg,.png,.gif";
string Eextension = FileEextension.ToLower();
//如果是图片则压缩
if (!string.IsNullOrEmpty(Eextension) && imageFormat.Contains(Eextension))
{
thumbnail = virtualPath.Substring(0, virtualPath.LastIndexOf(".")) + ".JPEG";
YaSuo(virtualPath, thumbnail, 10);
}
//文件信息写入数据库
fileAnnexesEntity.F_Id = fileGuid;
fileAnnexesEntity.F_FileName = fileName;
fileAnnexesEntity.F_FilePath = virtualPath;
fileAnnexesEntity.F_ThumbnailImgPath = thumbnail;
fileAnnexesEntity.F_FileSize = filesize.ToString();
fileAnnexesEntity.F_FileExtensions = FileEextension;
fileAnnexesEntity.F_FileType = FileEextension.Replace(".", "");
fileAnnexesEntity.F_CreateUserId = userInfo.userId;
fileAnnexesEntity.F_CreateUserName = userInfo.realName;
fileAnnexesEntity.F_WebFileID = WebFileID;
SaveEntity(folderId, fileAnnexesEntity);
}
return true;
}
catch (Exception ex)
{
if (ex is ExceptionEx)
{
throw;
}
else
{
throw ExceptionEx.ThrowBusinessException(ex);
}
}
}
/// <summary>
/// 图片压缩
/// </summary>
/// <param name="srcPath">需要压缩的文件路径</param>
/// <param name="outPath">压缩后输出到哪个路径</param>
/// <param name="flag">压缩比例</param>
/// <returns></returns>
public bool YaSuo(string srcPath, string outPath, int flag)
{
Image iSource = Image.FromFile(srcPath);
ImageFormat tFormat = iSource.RawFormat;
EncoderParameters ep = new EncoderParameters();
long[] qy = new long[1];
qy[0] = flag;
EncoderParameter eParam = new EncoderParameter(Encoder.Quality, qy);
ep.Param[0] = eParam;
try
{
ImageCodecInfo[] arrayICI = ImageCodecInfo.GetImageDecoders();
ImageCodecInfo jpegICIinfo = null;
for (int x = 0; x < arrayICI.Length; x++)
{
if (arrayICI[x].FormatDescription.Equals("JPEG"))
{
jpegICIinfo = arrayICI[x];
break;
}
}
if (jpegICIinfo != null)
iSource.Save(outPath, jpegICIinfo, ep);
else
iSource.Save(outPath, tFormat);
iSource.Dispose();
return true;
}
catch (Exception ex)
{
iSource.Dispose();
return false;
}
}
/// <summary>
/// 保存附件
/// </summary>
/// <param name="fileGuid">文件主键</param>
/// <param name="fileName">文件名称</param>
/// <param name=" FilePath">文件路径</param>
/// <param name="Filelength">文件大小</param>
/// <param name="folderId">文件附键</param>
/// <returns></returns>
public void SaveAnnexesFileEntity(string folderid, AnnexesFileEntity fileAnnexesEntity)
{
try
{
SaveEntity(folderid, fileAnnexesEntity);
}
catch (Exception ex)
{
if (ex is ExceptionEx)
{
throw;
}
else
{
throw ExceptionEx.ThrowBusinessException(ex);
}
}
}
/// <summary>
/// 保存附件(支持大文件分片传输)
/// </summary>
/// <param name="fileGuid">文件主键</param>
/// <param name="fileName">文件名称</param>
/// <param name="chunks">文件总共分多少片</param>
/// <param name="fileStream">文件二进制流</param>
/// <returns></returns>
public string SaveAnnexes(string fileGuid, string fileName, int chunks, UserInfo userInfo)
{
try
{
//获取文件完整文件名(包含绝对路径)
//文件存放路径格式:/Resource/ResourceFile/{userId}/{date}/{guid}.{后缀名}
string filePath = Config.GetValue("AnnexesFile");
string uploadDate = DateTime.Now.ToString("yyyyMMdd");
string FileEextension = Path.GetExtension(fileName);
string virtualPath = string.Format("{0}/{1}/{2}/{3}{4}", filePath, userInfo.userId, uploadDate, fileGuid, FileEextension);
//创建文件夹
string path = Path.GetDirectoryName(virtualPath);
Directory.CreateDirectory(path);
AnnexesFileEntity fileAnnexesEntity = new AnnexesFileEntity();
if (!System.IO.File.Exists(virtualPath))
{
long filesize = SaveAnnexesToFile(fileGuid, virtualPath, chunks);
if (filesize == -1)// 表示保存失败
{
RemoveChunkAnnexes(fileGuid, chunks);
return "";
}
}
return virtualPath;
}
catch (Exception ex)
{
if (ex is ExceptionEx)
{
throw;
}
else
{
throw ExceptionEx.ThrowBusinessException(ex);
}
}
}
/// <summary>
/// 保存附件到文件中
/// </summary>
/// <param name="fileGuid">文件主键</param>
/// <param name="filePath">文件路径</param>
/// <param name="chunks">总共分片数</param>
/// <param name="buffer">文件二进制流</param>
/// <returns>-1:表示保存失败</returns>
public long SaveAnnexesToFile(string fileGuid, string filePath, int chunks)
{
try
{
long filesize = 0;
//创建一个FileInfo对象
FileInfo file = new FileInfo(filePath);
//创建文件
FileStream fs = file.Create();
for (int i = 0; i < chunks; i++)
{
byte[] bufferByRedis = cache.Read<byte[]>(cacheKey + i + "_" + fileGuid, CacheId.annexes);
if (bufferByRedis == null)
{
return -1;
}
//写入二进制流
fs.Write(bufferByRedis, 0, bufferByRedis.Length);
filesize += bufferByRedis.Length;
cache.Remove(cacheKey + i + "_" + fileGuid, CacheId.annexes);
}
//关闭文件流
fs.Close();
return filesize;
}
catch (Exception ex)
{
if (ex is ExceptionEx)
{
throw;
}
else
{
throw ExceptionEx.ThrowBusinessException(ex);
}
}
}
/// <summary>
/// 保存分片附件
/// </summary>
/// <param name="fileGuid">文件主键</param>
/// <param name="chunk">分片文件序号</param>
/// <param name="fileStream">文件流</param>
public void SaveChunkAnnexes(string fileGuid, int chunk, Stream fileStream)
{
try
{
byte[] bytes = new byte[fileStream.Length];
fileStream.Read(bytes, 0, bytes.Length);
cache.Write<byte[]>(cacheKey + chunk + "_" + fileGuid, bytes, CacheId.annexes);
}
catch (Exception ex)
{
if (ex is ExceptionEx)
{
throw;
}
else
{
throw ExceptionEx.ThrowBusinessException(ex);
}
}
}
/// <summary>
/// 移除文件分片数据
/// </summary>
/// <param name="fileGuid">文件主键</param>
/// <param name="chunks">文件分片数</param>
public void RemoveChunkAnnexes(string fileGuid, int chunks)
{
try
{
for (int i = 0; i < chunks; i++)
{
cache.Remove(cacheKey + i + "_" + fileGuid, CacheId.annexes);
}
}
catch (Exception ex)
{
if (ex is ExceptionEx)
{
throw;
}
else
{
throw ExceptionEx.ThrowBusinessException(ex);
}
}
}
#endregion
#region copyFile
/// <summary>
/// 创建一个新annexeFile记录sql没具体执行同时复制一份文件
/// </summary>
/// <param name="resourceFile"></param>
/// <param name="newFolderId"></param>
/// <param name="docName"></param>
/// <returns></returns>
public AnnexesFileEntity copyFile(AnnexesFileEntity resourceFile, string newFolderId, string docName,out string error)
{
error = "";
var userInfo = LoginUserInfo.Get();
var res = "";
if (!string.IsNullOrWhiteSpace(resourceFile.F_FilePath))
{
if (File.Exists(resourceFile.F_FilePath))
{
#region annexes和drawingfile
string destinationDirectory = System.IO.Path.GetDirectoryName(resourceFile.F_FilePath);
// 生成随机文件名
string randomFileName = Guid.NewGuid().ToString() + System.IO.Path.GetExtension(resourceFile.F_FilePath);
string destinationPath = System.IO.Path.Combine(destinationDirectory, randomFileName);
try
{
// 复制文件
File.Copy(resourceFile.F_FilePath, destinationPath, overwrite: true);
}
catch (Exception e)
{
error = $"★★★复制Annexe文件{resourceFile.F_FileName}时错误:{e.Message}★★★";
}
resourceFile.F_Id = newFolderId;
resourceFile.F_FolderId = resourceFile.F_Id;
resourceFile.F_FileName = docName;
resourceFile.F_FilePath = destinationPath;
resourceFile.F_CreateDate = Time.MySqlTime;
resourceFile.F_CreateUserId = userInfo.userId;
resourceFile.F_CreateUserName = userInfo.realName;
#endregion
}
else
{
error = $"源图纸 {docName} 在服务器中找不到存储位置,请确认。";
}
}
else
{
error = $"源图纸 {docName} 在数据库中的存储路径为空,请确认。";
}
return resourceFile;
}
#endregion
/// <summary>
///
/// </summary>
/// <param name="path"></param>
/// <returns></returns>
public bool Exists(string path)
{
bool result = false;
if (File.Exists(path))
{
result = true;
}
return result;
}
}
}