• FTP文件操作之上传文件


    上传文件是一个比较常用的功能,前段时间就做了一个上传图片的模块。开始采用的是共享文件夹的方式,后来发现这种方法不太好。于是果断将其毙掉,后来选择采用FTP的方式进行上传。个人感觉FTP的方式还是比较好用的,所以跟大家分享一下。

    /// <summary>
            /// FTP上传文件
            /// </summary>
            /// <param name="fileUpload">上传控件</param>
            /// <param name="ftpServerIP">上传文件服务器IP</param>
            /// <param name="ftpUserID">服务器用户名</param>
            /// <param name="ftpPassword">服务器密码</param>
            /// <returns></returns>
            public  string Upload(FileUpload fileUpload, string ftpServerIP, string ftpUserID, string ftpPassword)
            {
                string filename = fileUpload.FileName;
                string sRet = "上传成功!";
                FileInfo fileInf = new FileInfo(fileUpload.PostedFile.FileName);
                string uri = "ftp://" + ftpServerIP + "/" + filename;
                FtpWebRequest reqFTP;
    
                // 根据uri创建FtpWebRequest对象 
                reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
    
                // ftp用户名和密码
                reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
    
                // 默认为true,连接不会被关闭
                // 在一个命令之后被执行
                reqFTP.KeepAlive = false;
    
                // 指定执行什么命令
                reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
    
                // 指定数据传输类型
                reqFTP.UseBinary = true;
                reqFTP.UsePassive = false;
    
                // 上传文件时通知服务器文件的大小
                reqFTP.ContentLength = fileInf.Length;
    
                // 缓冲大小设置为2kb
                int buffLength = 2048;
    
                byte[] buff = new byte[buffLength];
                int contentLen;
    
                // 打开一个文件流 (System.IO.FileStream) 去读上传的文件
                FileStream fs = fileInf.OpenRead();
    
                try
                {
                    // 把上传的文件写入流
                    Stream strm = reqFTP.GetRequestStream();
    
                    // 每次读文件流的2kb
                    contentLen = fs.Read(buff, 0, buffLength);
    
                    // 流内容没有结束
                    while (contentLen != 0)
                    {
                        // 把内容从file stream 写入 upload stream
                        strm.Write(buff, 0, contentLen);
    
                        contentLen = fs.Read(buff, 0, buffLength);
                    }
    
                    // 关闭两个流
                    strm.Close();
                    fs.Close();
                }
                catch (Exception ex)
                {
                    sRet = ex.Message;
                }
                return sRet;
            }

    上面只是一个简单的上传,当然上传之前还需要对文件进行一些验证,例如文件格式或者文件的大小之类的。简单验证请参考上传图片之上传前判断文件格式与大小

    为了防止重名,可以使用全局唯一标示符GUID,生成一个随机序列,在理想情况下,任何计算机和计算机集群都不会生成两个相同的GUID。当然重复的几率也并不为0,但是非常小了。

    /// <summary>
    /// 生成全局唯一标示符
    /// </summary>
    /// <returns></returns>
    public string strGUID()
    {
        string strguid = Guid.NewGuid().ToString();
        return strguid;
    }

    调用这个方法,然后将返回的序列跟文件名拼接就可以有效的避免文件重名的情况了。当然也可以用系统当前时间来跟文件名进行拼接,这样或许你感觉更保险一些。具体用那种方法就见仁见智了。

  • 相关阅读:
    hdu 2485 Destroying the bus stations 迭代加深搜索
    hdu 2487 Ugly Windows 模拟
    hdu 2492 Ping pong 线段树
    hdu 1059 Dividing 多重背包
    hdu 3315 My Brute 费用流,费用最小且代价最小
    第四天 下载网络图片显示
    第三天 单元测试和数据库操作
    第二天 布局文件
    第一天 安卓简介
    Android 获取存储空间
  • 原文地址:https://www.cnblogs.com/liulaocai2/p/4337588.html
Copyright © 2020-2023  润新知