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

 

  1. /// <summary>
  2. /// FTP上传文件
  3. /// </summary>
  4. /// <param name="fileUpload">上传控件</param>
  5. /// <param name="ftpServerIP">上传文件服务器IP</param>
  6. /// <param name="ftpUserID">服务器用户名</param>
  7. /// <param name="ftpPassword">服务器密码</param>
  8. /// <returns></returns>
  9. public string Upload(FileUpload fileUpload, string ftpServerIP, string ftpUserID, string ftpPassword)
  10. {
  11. string filename = fileUpload.FileName;
  12. string sRet = "上传成功!";
  13. FileInfo fileInf = new FileInfo(fileUpload.PostedFile.FileName);
  14. string uri = "ftp://" + ftpServerIP + "/" + filename;
  15. FtpWebRequest reqFTP;
  16.  
  17. // 根据uri创建FtpWebRequest对象
  18. reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
  19.  
  20. // ftp用户名和密码
  21. reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
  22.  
  23. // 默认为true,连接不会被关闭
  24. // 在一个命令之后被执行
  25. reqFTP.KeepAlive = false;
  26.  
  27. // 指定执行什么命令
  28. reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
  29.  
  30. // 指定数据传输类型
  31. reqFTP.UseBinary = true;
  32. reqFTP.UsePassive = false;
  33.  
  34. // 上传文件时通知服务器文件的大小
  35. reqFTP.ContentLength = fileInf.Length;
  36.  
  37. // 缓冲大小设置为2kb
  38. int buffLength = 2048;
  39.  
  40. byte[] buff = new byte[buffLength];
  41. int contentLen;
  42.  
  43. // 打开一个文件流 (System.IO.FileStream) 去读上传的文件
  44. FileStream fs = fileInf.OpenRead();
  45.  
  46. try
  47. {
  48. // 把上传的文件写入流
  49. Stream strm = reqFTP.GetRequestStream();
  50.  
  51. // 每次读文件流的2kb
  52. contentLen = fs.Read(buff, 0, buffLength);
  53.  
  54. // 流内容没有结束
  55. while (contentLen != 0)
  56. {
  57. // 把内容从file stream 写入 upload stream
  58. strm.Write(buff, 0, contentLen);
  59.  
  60. contentLen = fs.Read(buff, 0, buffLength);
  61. }
  62.  
  63. // 关闭两个流
  64. strm.Close();
  65. fs.Close();
  66. }
  67. catch (Exception ex)
  68. {
  69. sRet = ex.Message;
  70. }
  71. return sRet;
  72. }

 

 

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

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

 

 

  1. /// <summary>
  2. /// 生成全局唯一标示符
  3. /// </summary>
  4. /// <returns></returns>
  5. public string strGUID()
  6. {
  7. string strguid = Guid.NewGuid().ToString();
  8. return strguid;
  9. }

 

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

FTP文件操作之上传文件的更多相关文章

  1. LoadRunner开发ftp协议接口之上传文件脚本

    Action() { //建立一个ftp对象 FTP ftp1=0; //建立FTP连接并登录 ftp_logon_ex(&ftp1,"ftpLogon", "U ...

  2. 2.3 利用FTP服务器下载和上传文件

    二.利用FTP服务器的下载文件 from ftplib import FTP from os.path import exists def getfile(file,site,dir,user=(), ...

  3. FTP主动模式上传文件时返回"ftp: accept: Resource temporarily unavailable"

    FTP主动模式上传文件时返回 Passive mode off ftp: accept: Resource temporarily unavailable 这个问题要从ftp的2种模式说起 PORT ...

  4. [实战]MVC5+EF6+MySql企业网盘实战(12)——新建文件夹和上传文件

    写在前面 之前的上传文件的功能,只能上传到根目录,前两篇文章实现了新建文件夹的功能,则这里对上传文件的功能进行适配. 系列文章 [EF]vs15+ef6+mysql code first方式 [实战] ...

  5. 孤荷凌寒自学python第三十五天python的文件操作之针对文件操作的os模块的相关内容

     孤荷凌寒自学python第三十五天python的文件操作之针对文件操作的os模块的相关内容 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 一.打开文件后,要务必记得关闭,所以一般的写法应当 ...

  6. JAVASE02-Unit06: 文件操作——File 、 文件操作—— RandomAccessFile

    Unit06: 文件操作--File . 文件操作-- RandomAccessFile java.io.FileFile的每一个实例是用来表示文件系统中的一个文件或目录 package day06; ...

  7. Unix无缓冲文件操作函数、文件信息查询

    问题描述:         Unix无缓冲文件操作函数.文件信息查询 问题解决:        struct stat 结构体信息: 具体代码: 具体源文件:

  8. JAVA文件操作类和文件夹的操作代码示例

    JAVA文件操作类和文件夹的操作代码实例,包括读取文本文件内容, 新建目录,多级目录创建,新建文件,有编码方式的文件创建, 删除文件,删除文件夹,删除指定文件夹下所有文件, 复制单个文件,复制整个文件 ...

  9. java文件操作(普通文件以及配置文件的读写操作)

    转自:java文件操作(普通文件以及配置文件的读写操作) 读取普通文件 : /** * xiangqiao123欢迎你 如果对代码有疑问可以加qq群咨询:151648295 * * 读取MyFile文 ...

随机推荐

  1. 无向图的最短路径算法JAVA实现(转)

    一,问题描述 给出一个无向图,指定无向图中某个顶点作为源点.求出图中所有顶点到源点的最短路径. 无向图的最短路径其实是源点到该顶点的最少边的数目. 本文假设图的信息保存在文件中,通过读取文件来构造图. ...

  2. 陈词滥调,正确使用memset

    前项目发现一个问题,计划永远是一个dynamic_cast当一个异常动态转换,搜索了半天才发现问题竟然是在memset使用,见.但当处于几十万行代码量级中时,就变得不太那么easy定位了. 本文归纳了 ...

  3. c语言太easy笔误的,这将做

    调试发现时间写的一样NB代码 test.c int add(string); int main() { char* p = "11222"; add(p); return 0; } ...

  4. Tutorial: 结合使用AngularJS和Django

    好吧,我承认自己很懒,时间又不够用. 翻译的几个文章都是虎头蛇尾,但我保证这次肯定不太监. 关键的单词不翻译,实在觉得翻译成汉语很别扭,括号里是参考翻译. 有问题和建议尽管提出来,我会改进完善. Tu ...

  5. Hasor:生命周期

    首先引用Wiki的介绍一下Hasor:     “Hasor是一款开源框架.它是为了解决企业模块化开发中复杂性而创建的.Hasor遵循简单的依赖.单一职责,在开发多模块企业项目中更加有调理.然而Has ...

  6. spring集成 JedisCluster 连接 redis3.0 集群

    最近在公司做了 jedisCluster整合spring 的配置, 分享如下 客户端采用最新的jedis 2.7 1. maven依赖: <dependency> <groupId& ...

  7. SQL Server 字段类型 decimal(18,6)小数点前是几位?记一次数据库SP的BUG处理

    原文:SQL Server 字段类型 decimal(18,6)小数点前是几位?记一次数据库SP的BUG处理 SQL Server 字段类型 decimal(18,6)小数点前是几位? 不可否认,这是 ...

  8. cocos2dx移植android平台

    本人这几天一直都没有跟新自己的网站内容,问我干什么去了,当然是做这篇文章做的事了,说起这个移植来真是麻烦啊,网上试验了各种方法,都不知道谁对谁错啊.不过经过本人这三天的研究最后终于成功了,为了让大家少 ...

  9. android细节之禁用activity的系统的默认切换效果

    网上有非常多方法来禁用系统的默认效果,这里贴上来我觉得最简单的方法. overridePendingTransition(Animation.INFINITE, Animation.INFINITE) ...

  10. Android SDK 5.0 这个语句带来折腾 - 生命在于折腾!

    Android SDK 5.0  带来的这番折腾 - 生命在于折腾! 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一 ...