从列表中删除文件后,文件上传控制会话不删除

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 上传文件之前从文件上传控件中删除文件

Azure 文件存储在删除本地副本之前上传后验证文件

在 Play Framework 中上传后从临时文件夹中删除文件

使用 dbutils 在 Databricks 中上传后从目录中删除文件

从 FileList Ajax 上传之前删除文件

Thinkphp5 删除上传文件