田爽 il y a 1 an
Parent
commit
22fb373ab2

+ 21 - 4
src/FileStorage.Host/Controllers/FileController.cs

@@ -29,10 +29,11 @@ namespace FileStorage.Host.Controllers
         }
 
         [HttpPost("upload")]
-        public IActionResult Upload(IFormFile fileData,string source)
+        public async Task<IActionResult> Upload(IFormFile fileData,string source)
         {
-            var file = _fileStorage.Upload(fileData.FileName, fileData.Length, "", fileData.OpenReadStream(), source ?? string.Empty);
-            return Ok(new { Id = file.Id, fileName = file.FileName,Path = file.Path });
+            var file = await _fileStorage.UploadAsync(fileData.FileName, fileData.Length, "", fileData.OpenReadStream(), source ?? string.Empty);
+            var Path = await  _fileStorage.GetFileUrlIndefinitelyAsync(file.Id, source ?? string.Empty);
+			return Ok(new { Id = file.Id, fileName = file.FileName,Path = Path });
         }
 
         [HttpGet("getfileurl")]
@@ -91,5 +92,21 @@ namespace FileStorage.Host.Controllers
             var fullPath = await _fileStorage.GetFilePath(id,expires,clientid,signature);
             await HttpContext.Response.SendFileAsync(fullPath);
         }
-    }
+
+        /// <summary>
+        /// ·ÃÎÊÎļþÎÞÏÞÆÚ
+        /// </summary>
+        /// <param name="id"></param>
+        /// <param name="expires"></param>
+        /// <param name="clientid"></param>
+        /// <param name="signature"></param>
+        /// <returns></returns>
+        [AllowAnonymous]
+        [HttpGet("files_indefinitely")]
+        public async Task FilesIndefinitely(string id, string expires, string clientid, string signature)
+        {
+	        var fullPath = await _fileStorage.GetFilePathIndefinitely(id, expires, clientid, signature);
+	        await HttpContext.Response.SendFileAsync(fullPath);
+        }
+	}
 }

+ 36 - 4
src/FileStorage/DefaultFileStorage.cs

@@ -27,7 +27,7 @@ public class DefaultFileStorage : IFileStorage, IScopeDependency
     /// <param name="fileData"></param>
     /// <param name="client"></param>
     /// <returns></returns>
-    public FileMetadata Upload(string fileName, long length, string extraInfo, Stream fileData, string client)
+    public async Task<FileMetadata> UploadAsync(string fileName, long length, string extraInfo, Stream fileData, string client)
     {
         if (fileName == null)
         {
@@ -53,7 +53,7 @@ public class DefaultFileStorage : IFileStorage, IScopeDependency
             fileModel.SaveMode = _fileUploadOptions.Value.Impt;
             fileModel.ExtraInfo = extraInfo;
             fileModel.UploadTime = DateTime.Now;
-            _fileMetadataRepository.AddAsync(fileModel);
+            await _fileMetadataRepository.AddAsync(fileModel);
             return fileModel;
         }
         return null;
@@ -73,7 +73,20 @@ public class DefaultFileStorage : IFileStorage, IScopeDependency
         throw new UserFriendlyException("无权限访问");
     }
 
-    public (Stream stream, string contentType,string fileName) DownLoadFile(string id,string clientId)
+    public async Task<Uri> GetFileUrlIndefinitely(string id, string clientId)
+    {
+	    var fileMetadata = await _fileMetadataRepository.GetAsync(x => x.Id == id && x.Client == clientId);
+	    if (fileMetadata != null)
+	    {
+		    long sTime = (long)(DateTime.Now.AddHours(1).ToUniversalTime() - new DateTime(1970, 1, 1, 0, 0, 0)).TotalSeconds;
+		    string encryptText = clientId + "|" + sTime + "|" + id;
+		    var signatureText = DESExtensions.Encrypt(encryptText);
+		    return new Uri(_fileUploadOptions.Value.Local.VisDomain + "file/files_indefinitely?id=" + id + "&expires=" + sTime + "&clientid=" + clientId + "&signature=" + signatureText);
+	    }
+	    throw new UserFriendlyException("无权限访问");
+    }
+
+	public (Stream stream, string contentType,string fileName) DownLoadFile(string id,string clientId)
     {
         var fileMetadata = _fileMetadataRepository.Get(x=>x.Id == id && x.Client == clientId);
         if (fileMetadata!=null)
@@ -128,8 +141,27 @@ public class DefaultFileStorage : IFileStorage, IScopeDependency
     }
 
 
+	public async Task<string> GetFilePathIndefinitely(string id, string expires, string clientId, string signature)
+	{
+		string decryptText = DESExtensions.Decrypt(signature);
+		if (!string.IsNullOrEmpty(decryptText))
+		{
+			string[] paramData = decryptText.Split('|');
+
+			if (id != paramData[2] || clientId != paramData[0] || expires != paramData[1])
+				throw UserFriendlyException.SameMessage("参数不合法");
+
+			var fileMetadata = await _fileMetadataRepository.GetAsync(x => x.Id == id && x.Client == clientId);
+			if (fileMetadata == null)
+				throw UserFriendlyException.SameMessage("无权限访问");
+
+			return GetFullPath(fileMetadata.Path);
+		}
+		throw UserFriendlyException.SameMessage("无权限访问");
+	}
+
 
-    private string TaskGetFileContentTypeAsync(string fileName)
+	private string TaskGetFileContentTypeAsync(string fileName)
     {
         string suffix = Path.GetExtension(fileName);
         var provider = new FileExtensionContentTypeProvider();

+ 4 - 1
src/FileStorage/IFileStorage.cs

@@ -3,7 +3,7 @@
     public interface IFileStorage
     {
 
-        FileMetadata Upload(string fileName, long length, string extraInfo, Stream fileData, string client);
+	    Task<FileMetadata> UploadAsync(string fileName, long length, string extraInfo, Stream fileData, string client);
 
         Task<Uri> GetFileUrlAsync(string id, string clientId);
 
@@ -15,5 +15,8 @@
 
         Task<string> GetFilePathAsync(string id, string clientId);
 
+        Task<string> GetFilePathIndefinitely(string id, string expires, string clientId, string signature);
+
+        Task<Uri> GetFileUrlIndefinitelyAsync(string id, string clientId);
 	}
 }