从列表中删除文件后,文件上传控制会话不删除
Posted
技术标签:
【中文标题】从列表中删除文件后,文件上传控制会话不删除【英文标题】:File Upload Control Session does not remove after remove file from list 【发布时间】:2020-08-22 14:10:18 【问题描述】:我为这个问题沮丧了几个星期,
我怎样才能为这个多文件上传做会话
if (Session["FileUpload1"] == null && FileUploadQ2.HasFile)
Session["FileUpload1"] = FileUploadQ2;
foreach (HttpPostedFile file in FileUploadQ2.PostedFiles)
listofuploadedfiles.Text += String.Format("<p><font color='black'>" + file.FileName + "</font><a class='close'><font color='red'>x</font><a>" + "</p>");
else if (Session["FileUpload1"] != null && (!FileUploadQ2.HasFile))
FileUploadQ2 = (FileUpload)Session["FileUpload1"];
else if(FileUploadQ2.HasFile)
Session["FileUpload1"] = FileUploadQ2;
【问题讨论】:
您到底想做什么?会话中的控件?为什么? @VDWWD 一个会话。我想对多个文件这样做codeproject.com/Tips/101834/… 只需将文件写入临时文件夹即可。 Session 不是用来存储文件的! @VDWWD 如果要删除选定的文件? 然后从磁盘中删除。 【参考方案1】:正如@VDWWD 所指出的,您不应该将文件存储在 Session 对象中 - 而是将它们存储在磁盘上。您可以在下面找到该功能的快速实现。
public interface IFileStorage
Task UploadFile(string fileName, Stream fileContent);
void TryRemoveFile(string fileName, out bool fileRemoved);
void GetFile(string fileName);
public class FileSystemStorage : IFileStorage
private readonly PhysicalFileProvider _fileProvider;
private readonly ILogger<FileSystemStorage>_logger;
public FileSystemStorage(IFileProvider fileProvider, ILogger<FileSystemStorage> logger)
_fileProvider = (PhysicalFileProvider)fileProvider;
_logger = logger;
public void GetFile(string fileName)
throw new NotImplementedException();
public void TryRemoveFile(string fileName, out bool fileRemoved)
try
RemoveFile(fileName);
fileRemoved = true;
catch(Exception ex)
_logger.LogError($"Couldnt remove file fileName: ex.ToString()" );
fileRemoved = false;
public async Task UploadFile(string fileName, Stream fileContent)
var filePath = Path.Combine(_fileProvider.Root, fileName);
if (_fileProvider.GetFileInfo(filePath).Exists)
throw new ArgumentException("Given file already exists!");
_logger.LogInformation($"Saving file to: filePath..");
using (Stream file = File.Create(filePath))
await fileContent.CopyToAsync(file);
file.Flush();
_logger.LogInformation($"File: filePath saved successfully.");
在 Startup.cs 中,ConfigureServices 方法添加以下行以注入 FileSystemStorage:
IFileProvider physicalProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), "AppData"));
services.AddSingleton<IFileProvider>(physicalProvider);
services.AddTransient<IFileStorage, FileSystemStorage>();
然后在您的控制器构造函数中获取 FileSystemStorage 实例。
【讨论】:
我已经更新了答案,所以它使用了 PhysicalFileProvider。它解决了你的问题吗?以上是关于从列表中删除文件后,文件上传控制会话不删除的主要内容,如果未能解决你的问题,请参考以下文章
如何在使用 jQuery 上传文件之前从文件上传控件中删除文件
在 Play Framework 中上传后从临时文件夹中删除文件