.Net Core实现经典文件上传下载功能
1.文件上传
[HttpPost]
public async Task<object> UploadFile(List<IFormFile> files, string FolderId)
{
var message = "Upload successful";
var fileNames = new List<string>();
var FileSizes = new List<long>();
var success = true;
foreach (var file in files)
{
var FileSite = int.Parse(_appConfiguration["FileManagements:FileSite"].ToString());
long maxFileSize = FileSite * 1024;
if ((file.Length / 1024) > maxFileSize)
{
message = $"The file size exceeds the {FileSite}MB limit.";
success = false;
break;
}
var allowed = _appConfiguration["FileManagements:allowedExtensions"].ToString();
var allowedExtensions = allowed.Split(",");
var fileExtension = Path.GetExtension(file.FileName).ToLowerInvariant();
if (!allowedExtensions.Contains(fileExtension))
{
message = "Invalid file type.";
success = false;
break;
}
var FilePath = _appConfiguration["FileManagements:FilePath"].ToString();
var folderData = await _folderManagementRepository.FirstOrDefaultAsync(x=> x.Id == long.Parse(FolderId));
if (folderData != null)
FilePath = Path.Combine(FilePath, folderData.FolderType, folderData.FolderName);
if (!Directory.Exists(FilePath))
{
Directory.CreateDirectory(FilePath);
}
var uniqueFileName = Guid.NewGuid().ToString("N") + "_" + file.FileName;
var filePath = Path.Combine(FilePath, uniqueFileName);
using (var fileStream = new FileStream(filePath, FileMode.Create))
{
await file.CopyToAsync(fileStream);
}
decimal size = file.Length / 1024;
var document = new CreateOrEditFileManagementDto
{
};
fileNames.Add(document.FileName);
FileSizes.Add(document.FileSize);
await Create(document);
}
return new { fileNames, FileSizes, message, success };
}
2.文件下载
[HttpGet]
public async Task<FileResult> DocumentFile(string token, bool IsFile = true)
{
var filePath = _appConfiguration["FileManagements:FilePath"].ToString();
if (folderManagementData != null)
{
if (folderManagementData.ParentId.Equals("0"))
{
filePath = Path.Combine(filePath, folderManagementData.FolderName);
}
else
{
filePath = Path.Combine(filePath, folderManagementData.FolderType, folderManagementData.FolderName);
}
}
if(IsFile)
filePath = Path.Combine(filePath, fileManagementData.FilePath);
var fileInfo = new FileInfo(filePath);
if (fileInfo.Attributes.HasFlag(FileAttributes.Directory))
{
return DocumentFolderZip(folderManagementData.FolderName, filePath);
}
else
{
var contentType = FileContentType(fileManagementData.FileExtension);
var fileDownloadName = fileManagementData.FileName + fileManagementData.FileExtension;
var fileResult = new FileStreamResult(new FileStream(filePath, FileMode.Open, FileAccess.Read), contentType)
{
FileDownloadName = fileDownloadName
};
return fileResult;
}
}
protected FileResult DocumentFolderZip(string folderName, string filePath)
{
string tempZipPath = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString() + ".zip");
using (var zip = ZipFile.Open(tempZipPath, ZipArchiveMode.Create))
{
var folderToZip = new DirectoryInfo(filePath);
foreach (var file in folderToZip.GetFiles("*", SearchOption.AllDirectories))
{
zip.CreateEntryFromFile(file.FullName, file.FullName.Substring(filePath.Length + 1), CompressionLevel.Optimal);
}
}
var contentType = "application/zip";
var fileResult = new FileStreamResult(new FileStream(tempZipPath, FileMode.Open, FileAccess.Read), contentType)
{
FileDownloadName = $"{folderName}.zip"
};
return fileResult;
}
private string FileContentType(string fileExtension)
{
string contentType = string.Empty;
switch (fileExtension.ToLower())
{
case ".txt":
contentType = "text/plain";
break;
default:
contentType = "application/octet-stream";
break;
}
return contentType;
}
3.增加上传文件大小 4294967296表示4GB
public IServiceProvider ConfigureServices(IServiceCollection services)
{
services.Configure<Microsoft.AspNetCore.Http.Features.FormOptions>(x =>
{
x.ValueLengthLimit = int.MaxValue;
x.MultipartBodyLengthLimit = 4294967296;
x.MultipartHeadersLengthLimit = int.MaxValue;
});
}