为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PIPIONE 2022-08-04 17:56:58
我为这个问题感到沮丧了几个星期,如何为此多文件上传进行会话  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;        }
查看完整描述

1 回答

?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

正如@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>();

然后在控制器构造函数中获取文件系统存储实例。


查看完整回答
反对 回复 2022-08-04
  • 1 回答
  • 0 关注
  • 102 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信