using Furion.DependencyInjection;
using Furion.DynamicApiController;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Ewide.RoadFlowLite.Serivce.Files
{
///
/// 文件读写
///
[Route("/api/roadflow/Files/")]
[ApiDescriptionSettings("RoadFlow")]
public class FilesService: IDynamicApiController, ITransient
{
/*
///
/// 保存CKEDITOR编辑器上传的文件
///
///
public string SaveCKEditorFiles()
{
var files = Request.Form.Files;
JObject jObject = new JObject();
if (files.Count == 0)
{
jObject.Add("number", -1);
jObject.Add("message", localizer["NotUploadFile"].Value);
return new JObject() { { "error", jObject } }.ToString();
}
var file = files[0];
string extName = Path.GetExtension(file.FileName).TrimStart('.');
if (!IsUpload(extName))
{
jObject.Add("number", -1);
jObject.Add("message", localizer["CannotUploadThisType"].Value);
return new JObject() { { "error", jObject } }.ToString();
}
Guid userId = Current.GetUserId(Request);
if (userId.IsEmptyGuid())
{
jObject.Add("number", -1);
jObject.Add("message", localizer["UserNotLogin"].Value);
return new JObject() { { "error", jObject } }.ToString();
}
DateTime date = DateExtensions.Now;
string attachmentPath = "/files/" + userId.ToLowerString() + "/uploads/";
string dateString = date.Year.ToString() + "/" + date.ToString("MM") + "/" + date.ToString("dd");
string saveDir = rootPath + attachmentPath + dateString + "/";
string fileName = file.FileName.Replace(" ", "");
string newFileName = GetUploadFileName(saveDir, fileName);
if (!Directory.Exists(saveDir))
{
Directory.CreateDirectory(saveDir);
}
using (FileStream fs = System.IO.File.Create(saveDir + newFileName))
{
file.CopyTo(fs);
fs.Flush();
}
JObject jObject1 = new JObject
{
{ "fileName", newFileName },
{ "uploaded", 1 },
{ "url", (Request.IsHttps ? "https://" : "http://") + Request.Host.Value + Url.Content("~/RoadFlowWeb/Files/Show?file=") + (attachmentPath + dateString + "/" + newFileName).DESEncrypt() }
};
return jObject1.ToString();
}
///
/// 保存控件上传的文件
///
///
public string SaveFiles()
{
DateTime dateTime = DateExtensions.Now;
string year = dateTime.ToString("yyyy");
string month = dateTime.ToString("MM");
string day = dateTime.ToString("dd");
var files = Request.Form.Files;
string filetype = Request.Forms("filetype");
JObject jObject = new JObject();
if (files.Count > 0)
{
var file = files[0];
string extName = Path.GetExtension(file.FileName).TrimStart('.');
if (!IsUpload(extName))
{
jObject.Add("error", localizer["CannotUploadThisType"].Value);
return jObject.ToString();
}
if (!filetype.IsNullOrWhiteSpace() && !("," + filetype + ",").ContainsIgnoreCase("," + extName + ","))
{
jObject.Add("error", localizer["CannotUploadThisType"].Value);
return jObject.ToString();
}
Guid userId = Current.GetUserId(Request);
if (userId.IsEmptyGuid())
{
jObject.Add("error", localizer["UserNotLogin"].Value);
return jObject.ToString();
}
string attachmentPath = "/files/" + userId.ToLowerString() + "/uploads/";
string saveDir = rootPath + attachmentPath + year + "/" + month + "/" + day + "/";
string fileName = file.FileName.Replace(" ", "");
string newFileName = GetUploadFileName(saveDir, fileName);
if (!Directory.Exists(saveDir))
{
Directory.CreateDirectory(saveDir);
}
using (FileStream fs = System.IO.File.Create(saveDir + newFileName))
{
file.CopyTo(fs);
//fs.Flush();
}
jObject.Add("id", (attachmentPath + year + "/" + month + "/" + day + "/" + newFileName).DESEncrypt());
jObject.Add("size", file.Length.ToFileSize());
}
return jObject.ToString();
}
///
/// 保存用户上传的签章图片
///
///
public string SaveUserSign()
{
var files = Request.Form.Files;
JObject jObject = new JObject();
if (files.Count > 0)
{
var file = files[0];
string extName = Path.GetExtension(file.FileName).TrimStart('.');
if (!IsUpload(extName))
{
jObject.Add("error", localizer["CannotUploadThisType"].Value);
return jObject.ToString();
}
Guid userId = Current.GetUserId(Request);
if (userId.IsEmptyGuid())
{
jObject.Add("error", localizer["UserNotLogin"].Value);
return jObject.ToString();
}
string saveDir = Config.ContentRootPath + "/wwwroot/roadflow-files/user-signs/" + userId.ToLowerString() + "/";
if (!Directory.Exists(saveDir))
{
Directory.CreateDirectory(saveDir);
}
using (FileStream fs = System.IO.File.Create(saveDir + "default.png"))
{
file.CopyTo(fs);
fs.Flush();
}
jObject.Add("id", "/roadflow-files/user-signs/" + userId.ToLowerString() + "/" + "default.png?v=" + GuidExtensions.NewGuid().ToLowerNString());
}
return jObject.ToString();
}
///
/// 保存用户上传的头像图片
///
///
public string SaveUserHeader()
{
var files = Request.Form.Files;
JObject jObject = new JObject();
if (files.Count > 0)
{
var file = files[0];
string extName = Path.GetExtension(file.FileName).TrimStart('.');
if (!IsUpload(extName))
{
jObject.Add("error", localizer["CannotUploadThisType"].Value);
return jObject.ToString();
}
Guid userId = Current.GetUserId(Request);
if (userId.IsEmptyGuid())
{
jObject.Add("error", localizer["UserNotLogin"].Value);
return jObject.ToString();
}
string saveDir = Config.ContentRootPath + "/wwwroot/roadflow-files/user-headers/" + userId.ToLowerString() + "/";
if (!Directory.Exists(saveDir))
{
Directory.CreateDirectory(saveDir);
}
string fileName = file.FileName.Replace(" ", "");
string newFileName = GetUploadFileName(saveDir, fileName);
using (FileStream fs = System.IO.File.Create(saveDir + newFileName))
{
file.CopyTo(fs);
fs.Flush();
}
jObject.Add("id", "/roadflow-files/user-headers/" + userId.ToLowerString() + "/" + newFileName + "?v=" + GuidExtensions.NewGuid().ToLowerNString());
}
return jObject.ToString();
}
///
/// 保存文件管理上传的文件
///
///
public string SaveFileManaeFiles()
{
var files = Request.Form.Files;
JObject jObject = new JObject();
if (files.Count > 0)
{
var file = files[0];
string extName = Path.GetExtension(file.FileName).TrimStart('.');
if (!IsUpload(extName))
{
jObject.Add("error", localizer["CannotUploadThisType"].Value);
return jObject.ToString();
}
Guid userId = Current.GetUserId(Request);
if (userId.IsEmptyGuid())
{
jObject.Add("error", localizer["UserNotLogin"].Value);
return jObject.ToString();
}
string dir = Request.Forms("dir").DESDecrypt();
string saveDir = dir.IsNullOrWhiteSpace() ? rootPath + "/files/" + userId.ToLowerString() + "/files/" : dir + "/";
string fileName = file.FileName.Replace(" ", "");
string newFileName = GetUploadFileName(saveDir, fileName);
if (!Directory.Exists(saveDir))
{
Directory.CreateDirectory(saveDir);
}
using (FileStream fs = System.IO.File.Create(saveDir + newFileName))
{
file.CopyTo(fs);
fs.Flush();
}
jObject.Add("id", (saveDir + newFileName).DESEncrypt());
jObject.Add("size", file.Length.ToFileSize());
}
return jObject.ToString();
}
///
/// 检查文件是否可以上传
///
///
///
private bool IsUpload(string extName)
{
return RoadFlow.Utility.Config.UploadFileExtNames.IsNullOrWhiteSpace()
? !",exe,msi,bat,cshtml,html,asp,aspx,ashx,ascx,cs,dll,js,vbs,css,".ContainsIgnoreCase("," + extName + ",")
: ("," + RoadFlow.Utility.Config.UploadFileExtNames + ",").ContainsIgnoreCase("," + extName + ",");
}
///
/// 得到上传文件名,如果重名要重新命名
///
///
///
///
private string GetUploadFileName(string saveDir, string fileName)
{
if (System.IO.File.Exists(saveDir + fileName))
{
string extName = Path.GetExtension(fileName);
string fName = Path.GetFileNameWithoutExtension(fileName) + "_" + Tools.GetRandomString(3).ToLower();
return GetUploadFileName(saveDir, fName + extName);
}
return fileName.Replace(" ", "");//去掉文件名中的空格(LibreOffice转为pdf时文件名有空格转换不了)
}
private (string, string) GetHeadType(string extName)
{
if (extName.IsNullOrWhiteSpace())
{
return ("attachment", "application/octet-stream");
}
string ext = extName.Trim().ToLower();
if (",jpg,jpeg,png,gif,tif,tiff,".Contains("," + ext + ","))
{
return ("inline", "image/" + ("jpg".Equals(ext) ? "jpeg" : ext));
}
else if (",txt,inf,log,ini,conf,cnf,".Contains("," + ext + ","))
{
return ("inline", "text/plain;charset=gb2312");//text/plain;charset=utf-8
}
else if (",pdf,".Contains("," + ext + ","))
{
return ("inline", "application/pdf");
}
else if (",json,".Contains("," + ext + ","))
{
return ("inline", "application/json");
}
else if (",doc,docx,dot,".Contains("," + ext + ","))
{
return ("attachment", "application/vnd.openxmlformats-officedocument.wordprocessingml.document");
}
else if (",xls,xlsx,".Contains("," + ext + ","))
{
return ("attachment", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
}
else if (",ppt,pptx,pps,pot,ppa,".Contains("," + ext + ","))
{
return ("attachment", "application/vnd.openxmlformats-officedocument.presentationml.presentation");
}
return ("attachment", "application/octet-stream");
}
///
/// 判断是否是office文件
///
///
///
private bool IsOfficeFile(string file)
{
string extName = Path.GetExtension(file);
return ",.doc,.docx,.xls,.xlsx,.ppt,.pptx,.wps,.dps,.et,".ContainsIgnoreCase("," + extName + ",");
}
///
/// 显示文件
///
[WebValidate]
public IActionResult Show()
{
string fileId = Request.Querys("file");
if (fileId.IsNullOrWhiteSpace())
{
fileId = Request.Querys("id");
}
if (fileId.IsNullOrWhiteSpace())
{
return new ContentResult() { Content = "文件不存在!", ContentType = "text/html;charset=utf-8" };
}
string file = fileId.DESDecrypt();
bool fullPath = "1".Equals(Request.Querys("fullpath"));//是否是完整路径(个人文件管理中传过来的路径就是文件完整路径)
FileInfo tmpFile = new FileInfo(fullPath ? file : rootPath + file);
if (!tmpFile.Exists)
{
return new ContentResult() { Content = "文件不存在!", ContentType = "text/html;charset=utf-8" };
}
//检查如果路径不是规定的路径,否则不能访问
if (fullPath && !RoadFlow.Business.UserFile.HasAccess(tmpFile.DirectoryName, Guid.Empty))
{
return new ContentResult() { Content = "不能访问!", ContentType = "text/html;charset=utf-8" };
}
bool isDownload = "1".Equals(Request.Querys("download"));//是否是下载文件
#region 如果是office文件转换为pdf显示
if (!isDownload && IsOfficeFile(file))
{
string tempDirectory = tmpFile.DirectoryName.Replace("\\", "/").Substring(rootPath.Replace("\\", "/").Length).TrimStart('/');
string pdfDirectory = rootPath + "/tmpfiles/" + tempDirectory + "/";
string pdfFileName = pdfDirectory + Path.GetFileNameWithoutExtension(tmpFile.FullName) + ".pdf";
if (!System.IO.File.Exists(pdfFileName))
{
pdfFileName = RoadFlow.Utility.DocExtensions.ToPdf(tmpFile.FullName, pdfDirectory);
if (!pdfFileName.IsNullOrWhiteSpace() && System.IO.File.Exists(pdfFileName))
{
tmpFile = new FileInfo(pdfFileName);
file = pdfFileName;
}
}
else
{
tmpFile = new FileInfo(pdfFileName);
file = pdfFileName;
}
}
#endregion
var tmpContentType = isDownload ? ("attachment", "application/octet-stream") : GetHeadType(Path.GetExtension(file).TrimStart('.'));
string fileName = tmpFile.Name.UrlEncode();
Response.Headers.Add("Accept-Ranges", new StringValues("bytes"));
Response.Headers.Add("Server-FileName", new StringValues(fileName));
//Response.Headers.Add("Content-Encoding", new StringValues("utf-8"));
//Response.Headers.Add("Vary", new StringValues("Accept-Encoding"));
Response.ContentType = tmpContentType.Item2;
Response.Headers.Add("Content-Disposition", new StringValues(tmpContentType.Item1 + ";filename=" + fileName));
Response.Headers.Add("Content-Length", new StringValues(tmpFile.Length.ToString()));
//using (var tmpRead = tmpFile.OpenRead())
//{
// var tmpByte = new byte[2048];
// var i = tmpRead.Read(tmpByte, 0, tmpByte.Length);
// while (i > 0)
// {
// Response.Body.WriteAsync(tmpByte, 0, i);
// Response.Body.FlushAsync();
// i = tmpRead.Read(tmpByte, 0, tmpByte.Length);
// }
//}
//Response.Body.FlushAsync();
//Response.Body.DisposeAsync();
//return new EmptyResult();
return File(tmpFile.OpenRead(), tmpContentType.Item2);
}
///
/// 验证码
///
public void ValidCode()
{
string guid = Request.Querys("guid");
string bgImg = RoadFlow.Utility.Tools.GetWebRootPath() + "/vcodebg.png";
System.IO.MemoryStream ms = RoadFlow.Utility.Tools.GetValidateImg(out string code, bgImg);
RoadFlow.Cache.IO.Insert("rf_vue_validcode_" + guid, code, DateExtensions.Now.AddMinutes(30));
Response.Clear();
Response.ContentType = "image/png";
Response.Body.WriteAsync(ms.GetBuffer(), 0, (int)ms.Length);
Response.Body.DisposeAsync();
}
*/
}
}