惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Recorded Future
Recorded Future
Apple Machine Learning Research
Apple Machine Learning Research
博客园_首页
S
SegmentFault 最新的问题
博客园 - 司徒正美
Last Week in AI
Last Week in AI
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
云风的 BLOG
云风的 BLOG
雷峰网
雷峰网
博客园 - 叶小钗
The GitHub Blog
The GitHub Blog
MyScale Blog
MyScale Blog
腾讯CDC
博客园 - 聂微东
D
DataBreaches.Net
博客园 - Franky
人人都是产品经理
人人都是产品经理
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 【当耐特】
量子位
宝玉的分享
宝玉的分享
D
Docker
T
Tailwind CSS Blog
IT之家
IT之家
Engineering at Meta
Engineering at Meta
P
Proofpoint News Feed
C
CERT Recently Published Vulnerability Notes
Scott Helme
Scott Helme
Project Zero
Project Zero
Microsoft Azure Blog
Microsoft Azure Blog
AWS News Blog
AWS News Blog
Google DeepMind News
Google DeepMind News
H
Heimdal Security Blog
W
WeLiveSecurity
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
有赞技术团队
有赞技术团队
Simon Willison's Weblog
Simon Willison's Weblog
NISL@THU
NISL@THU
C
Cybersecurity and Infrastructure Security Agency CISA
Google DeepMind News
Google DeepMind News
T
Threatpost
TaoSecurity Blog
TaoSecurity Blog
N
News and Events Feed by Topic
aimingoo的专栏
aimingoo的专栏
Recent Commits to openclaw:main
Recent Commits to openclaw:main
www.infosecurity-magazine.com
www.infosecurity-magazine.com
SecWiki News
SecWiki News
S
Securelist

博客园 - 落尘

.NET上传图片加文字和水印图片源码 - 落尘 - 博客园 ASP.NET 2.0 多文件上传小经验 文件的上传和下载 在ASP.NET程序中实现语音合成 .Net平台下开发中文语音应用程序 语音合成与识别技术在C#中的应用 如何防止ASP 木马在服务器上运行 用ASP实现在线压缩与解压缩 asp对象化之:基于adodb.stream的文件操作类 js鼠标及对象坐标控制属性 NET中各种数据库连接大全 几个ASP.NET技巧 设计ASP.NET应用程序的七大绝招 ASP.NET中如何调用存储过程 Asp.net cache 简述 如何用C#把Doc文档转换成rtf格式 单点登陆 硬盘双击无法打开是咋回事 Asp.net直接保存文件到客户端
ASP.NET下的多文件上传
落尘 · 2007-02-05 · via 博客园 - 落尘

最近在做ASP.NET 2.0的应用时候发现Session并不能很好的保存HtmlInputFile这个控件,具体表现是:如果客户机和服务机是一台的话(一般单机开发情况都是这样)Session能很好的保存任何对象,但是如果把项目发布部署到真正的服务器上Session只能保存很小的一笔数据,对于稍微大点的文件就提示“无法访问已关闭的文件”,意思应该是我的InputStream流早就关闭了,根本没法再读取了。查了一下ASP.NET 2.0Web.config的配置也都没能解决这个现象,索性不用Session来存储了,改成CacheViewState也能存储只是需要更新到页面,效率很低,所以没有采用)。前面说道了HtmlInputFile控件中包含了流对象,这样控件无法被序列化也就没有办法直接保存到一个Cache对象中,所以我只好又写了一个表示文件的类(CustomFile)来保存上传文件的相关信息。

类定义,FileBytes是二进制文件的数据类型byte[]FileContentType文件MIME类型,FileSize文件的大小,FullFileName表示带路径的文件全名,最后还有一个SaveAs方法用来保存到服务器指定路径中。 

接下来的事情就是要把CustomFile这个类的实例都保存到Cache中,以便以后一次全部上传到服务器。这样的工作笔者通过一个用户控件来实现,方便快捷。用户通过“浏览”选择本地文件,用“增加”把文件加载到指定Cache中,“删除”可以删除掉选择错的文件。控件的截图

控件就一个最重要的对外属性GetFiles,通过这个方法可以获取保存在Cache中的CustomFile数组(即表示多个上传文件)。

还有一个方法Clear是上传后来清空Cache的,非常重要一定要使用,否则还会继续上传上次已经传过的文件!!!

控件说明

文件上传控件IDFileUpload1

增加按钮IDbtnAdd

删除按钮IDbtnDelete

文件列表IDLbFiles

源代码:

public partial class FileUploadControl : System.Web.UI.UserControl

{

    /// <summary>

    /// 预先定义一个Cache名称

    /// </summary>

    private string _vName = "MyFile";

    private ArrayList _FileInfo = new ArrayList();

    private CustomFile Files

    {

        set

        {

            if ( Cache["" + _vName + ""] != null )

            {

                _FileInfo = (ArrayList) Cache["" + _vName + ""];

            }

            else

                _FileInfo = new ArrayList();

            _FileInfo.Add( value );

            Cache["" + _vName + ""] = _FileInfo;

        }

    }

    /// <summary>

    /// 获取自定义上传文件类

    /// </summary>

    public CustomFile[ ] GetFiles

    {

        get

        {

            if ( Cache["" + _vName + ""] != null )

            {

                _FileInfo = (ArrayList) Cache["" + _vName + ""];

            }

            else

                _FileInfo = new ArrayList();

            return (CustomFile[ ]) _FileInfo.ToArray( typeof( CustomFile ) );

        }

    }

    /// <summary>

    /// 清除已经上载过的文件

    /// </summary>

    public void Clear ()

    {

        Cache.Remove( "" + _vName + "" );

        LbFiles.Items.Clear();

    }

    /// <summary>

    /// 删除附件

    /// </summary>

    /// <param name="p_FileName">文件全名</param>

    private void DeleteFile ( string p_FileName )

    {

        if ( Cache["" + _vName + ""] != null )

        {

            for ( int i = 0; i < GetFiles.Length; i++ )

            {

                if ( GetFiles[i].FullFileName == LbFiles.SelectedItem.Text )

                {

                    ( (ArrayList) Cache["" + _vName + ""] ).RemoveAt( i );

                }

            }

        }

    }

    protected void Page_Load(object sender, EventArgs e)

    {

    }

    protected void btnAdd_Click ( object sender, EventArgs e )

    {

        CustomFile _cf = new CustomFile();

        _cf.FileBytes = FileUpload1.FileBytes;

        _cf.FullFileName = FileUpload1.PostedFile.FileName;

        _cf.FileSize = FileUpload1.PostedFile.ContentLength;

        _cf.FileContentType = FileUpload1.PostedFile.ContentType;

        Files = _cf;

        LbFiles.Items.Add( _cf.FullFileName );

    }

    protected void btnDelete_Click ( object sender, EventArgs e )

    {

        int ItemCount = LbFiles.Items.Count;

        for ( int j = 0; j < ItemCount; j++ )

        {

            for ( int i = 0; i < LbFiles.Items.Count; i++ )

            {

                if ( LbFiles.Items[i].Selected )

                {

                    DeleteFile( LbFiles.Items[i].Text );

                    LbFiles.Items.Remove( LbFiles.Items[i] );

                }

            }

        }       

    }

}

以上控件在.NET Framework 2.0 Windows Server 2000 下测试通过。