程序代码: [ 复制代码到剪贴板 ]
When I started to use .Text as my blogging engine I soon missed a place to upload files or images or documents that I can attach to my posts. So I needed to create it.

原文地址:Add a File Repository to .Text 0.95 
文件下载:File Repository for DotText 0.95

它给.Text 0.95增加了一个文件管理,使用户可以上传并进行管理。很好的一个主意。FreeTextBox中其实也有这样的功能。这里先不说FreeTextBox。

从集成角度上,它可以很好的与.Text 0.95合为一体,它没有使用数据库,完全以System.IO进行。从应用角度上,它对于上传的文件没有做任何限制,对上传文件的大小也没有做控制,当然,这方面也没有必要多讨论。个人看法,对于一个多用户版的系统来说,我觉得就不得不考虑这个问题了。试想,传一个ASPX文件上去呢???:),恐怕连主机的安全都会成问题了。何况前段时间动网论坛上传文件的漏洞也已经使很多用户头痛不已了。

正好以前做过上传组件,那就修改一下,主要思路如下:

首先需要在根目录下的web.config中加入几条参数:

  <add key="UserTotalUpLoadSize" value="3145728" />用户最大使用空间,字节数:3M
  <add key="AllowGalleryUpLoadType" value="gif,jpg,jpeg,png,bmp" />相册可上传文件类型
  <add key="AllowFileUpLoadType" value="gif,jpg,jpeg,png,bmp,swf,doc,zip,rar,txt,xls" />充许上传文件类型
  <add key="AllowFileUpLoadSize" value="307200" />上传文件最大字节数:300K
  <add key="FileUpLoadContent" value="files" />用户上传文件目录(针对上面的那个插件)

说明:相册功能中已经有对文件类型的检查,在Dottext.Framework.Images类中的ValidateFile方法,在修改文件上传这一块,也做了些修改,用一个方法实现就够了。
因为ValidateFile方法本身还有一个功能,就是检查要上传的图片是否已经在服务器端存在。修改后,让ValidateFile方法只具备后者的功能就够了。
public static bool ValidateFile(string filepath)
  {
   return !(File.Exists(filepath));
  }

在Dottext.Framework.Images类中,增加以下方法:

  #region FileUpload(HttpPostedFile _postedFile):一般文件上传
  /// <summary>
  /// 一般文件上传FileUpload
  /// </summary>
  /// <returns>当上传文件符合上传类型和大小时,保存文件,并返回值为真,否则为假。</returns>
  public static bool FileUpload(HttpPostedFile _postedFile,String _fileuploadpath,String _uploadfilename)
  {
   bool returnresultbool=false;
   try
   {
    _postedFile.SaveAs(_fileuploadpath+_uploadfilename);
    returnresultbool=true;
   }
   catch
   {
    returnresultbool=false;
   }
   return returnresultbool;
  }
  #endregion

  #region CheckUploadFileTypeSize:检测上传文件的大小
  public static bool CheckUploadFileTypeSize(HttpPostedFile _postedFile,int _allowfileuploadsize)
  {
   bool checkresultbool=false;
   if (_postedFile.ContentLength>_allowfileuploadsize)
   {
    checkresultbool=false;
   }
   else
   {
    checkresultbool=true;
   }
   return checkresultbool;
  }
  #endregion
  #region 判断文件类型是否符合要求
  public static bool CheckFileType(HttpPostedFile _postedFile,String _allowfileuploadtype)
  {
   bool checkresultbool=false;
   String _tempimgtype=_allowfileuploadtype;
   Char bar = ',';
   String[] _temp_type =_tempimgtype.Split(bar);
   for (int i=0;i<_temp_type.Length;i++)
   {
    if (GetUploadFileType(_postedFile.FileName)==_temp_type[i])
    {
     checkresultbool = true;
    }
   }
   return checkresultbool;
  }
  #endregion
  #region 得到文件的类型
  /// <summary>
  /// GetUploadFileType,得到文件的类型
  /// </summary>
  /// <param name="_postedFile">文件名</param>
  /// <returns>文件类型</returns>
  public static String GetUploadFileType(String _temp_filename)
  {
   return _temp_filename.Substring(_temp_filename.Length - (_temp_filename.Length-_temp_filename.LastIndexOf(".")-1)).ToLower();
  }
  #endregion
  #region RandomFileName():按日期和1000以内随机数生成文件名
  /// <summary>
  /// RandomFileName():按日期和1000以内随机数生成文件名
  /// </summary>
  /// <returns>字符串</returns>
  public static String RandomFileName(int _intnumber)
  {
   Char bar = '0';
   DateTime moment = DateTime.Now;
   String monthtime = moment.Month.ToString();
   monthtime = monthtime.PadLeft(2, bar);
   String daytime  = moment.Day.ToString();
   daytime = daytime.PadLeft(2, bar);
   String hourtime  = moment.Hour.ToString();
   hourtime = hourtime.PadLeft(2, bar);
   String minutetime = moment.Minute.ToString();
   minutetime = minutetime.PadLeft(2, bar);
   String secondtime  = moment.Second.ToString();
   secondtime = secondtime.PadLeft(2, bar);
   String uploadfilename = moment.Year.ToString() + monthtime + daytime + hourtime + minutetime + secondtime + Randomstring(_intnumber);
   return uploadfilename;
  }
  #endregion
  #region Randomstring(int intnum):返回给定数值以内的随机数
  /// <summary>
  /// Randomstring():返回给定数值以内的随机数
  /// </summary>
  /// <param name="intnum">给定的整数</param>
  /// <returns>返回给定整数内的随机数,若给定的数小于1,则返回当时时间的随机数</returns>
  public static String Randomstring(int intnum)
  {
   Random rad = new Random(unchecked((int)DateTime.Now.Ticks));
   if (intnum>1)
   {
    return rad.Next(intnum).ToString();
   }
   else
   {
    return rad.Next().ToString();
   }
  }
  #endregion

  #region 返回一个目录所占用的空间大小
  /// <summary>
  /// ListFolderTotalSize(string userFolder):返回指定目录中所有文件占用的空间
  /// </summary>
  /// <param name="long">返回数值</param>
  /// <returns>当指定一个目录,采用递归方式,获得所有文件与子目录下的文件所占空间的大小
  ///此方法用来扩展上传文件和相册文件,可以计算一个用户已经占用的空间大小,从而可以与
  ///web.config中所定义的UserTotalUpLoadSize值进行比较,从而决定用户是否可以继续上传
  ///</returns>
  public static long ListFolderTotalSize(string userFolder)
  {
   long fileSizemain = 0;
   DirectoryInfo mainDir = new DirectoryInfo(userFolder);
   FileInfo[] Finfosmain = mainDir.GetFiles();
   foreach(FileInfo f in Finfosmain)
   {
    fileSizemain += f.Length;
   }
   DirectoryInfo[] Dinfos = mainDir.GetDirectories();
   for(int i=0;i<Dinfos.Length;i++)
   {
    fileSizemain += ListFolderTotalSize(Dinfos[i].FullName);
   }
   return fileSizemain;
  }
  #endregion
 }

在上面插件的文件中,修改Files.aspx.cs

  private void SaveFileToUserFolder(System.Web.UI.HtmlControls.HtmlInputFile theFile)
  {
   String _fileuploadpath = Dottext.Framework.Images.LocalFilePath(Context) + ConfigurationSettings.AppSettings["FileUpLoadContent"] + "\\";

   CheckUserFolder(_fileuploadpath);

   String _allowfiletype = ConfigurationSettings.AppSettings["AllowFileUpLoadType"];
   int _allowfliesize = Convert.ToInt32(ConfigurationSettings.AppSettings["AllowFileUpLoadSize"]);

   if (!Dottext.Framework.Images.CheckFileType(theFile.PostedFile,_allowfiletype))
   {
    Messages.ShowError("所上传的文件并不是指定的类型,请重新选择!");
    return;
   }
   if (!Dottext.Framework.Images.CheckUploadFileTypeSize(theFile.PostedFile,_allowfliesize))
   {
    Messages.ShowError("所上传的文件的太大,请重新选择!");
    return;
   }

   String _uploadfilename = Dottext.Framework.Images.RandomFileName(1000) + "." + Dottext.Framework.Images.GetUploadFileType(theFile.PostedFile.FileName);

   if (!Dottext.Framework.Images.FileUpload(theFile.PostedFile,_fileuploadpath,_uploadfilename))
   {
    Messages.ShowError("上传文件失败!");
   }
   else
   {
    Messages.ShowMessage("上传文件成功!");
   }
  }

  private void CheckUserFolder(String _fileuploadpath)
  {
   try 
   {
    Dottext.Framework.Images.CheckDirectory(_fileuploadpath);
   }
   catch (Exception e)
   {
    Messages.ShowError(e.Message);
   }
  }

ListFolderTotalSize(string userFolder):返回指定目录中所有文件占用的空间这一方法,需要和相册一并使用,以实现按空间分配的定额数来充许用户上传。如下:

文件名 链接地址 操 作 
20040602021540948.jpg http://localhost/flyangel/files/20040602021540948.jpg 下载 删除 
目前使用个人空间:293 KB,你还可以上传2778 KB