多項目上傳文件解決方案之:服務器端

      關於服務器端,其實就是一個文件中轉站,將客戶端上傳的文件先保存在服務器端的臨時文件夾裏,而後再經過ftp類上傳到相關的資源服務器上,上傳完成後刪除文件,返回給客戶端資源的訪問路徑。      web

      前面了提到過了。在服務器端只須要提供兩個接口。一個獲取配置參數、一個上傳文件。接下來詳細的介紹下這兩個接口,以及實現方式。數據庫

      準備工做:服務器

      一臺資源服務器。要求:app

            一、一個http訪問入口。工具

            二、一個ftp賬號。須要有上傳文件、建立目錄權限。ftp賬號的根目錄須要訪問入口能訪問獲得。開發工具

      開發工具:vs2012。使用MVC4.0。this

      準備工做就需後,咱們就能夠進入編碼工做了。編碼

      首先咱們定義一個類用來序列化、反序列化配置文件。   Upload.cs  spa

public class Upload : ConfigCache.IConfiger
    {
        /// <summary>
        /// 以/結尾 例如:http://www.xxx.com/ 或者 http://www.xxx.com/file/
        /// </summary>
        public string BasePath { get; set; }
        public string FtpAddress { get; set; }
        public string FtpPort { get; set; }
        public string FtpUser { get; set; }
        public string FtpPwd { get; set; }
        public UploadItem[] UploadItem { get; set; }
    }

    public class UploadItem
    {
        /// <summary>
        /// 分類
        /// </summary>
        public string Type { get; set; }
        /// <summary>
        /// 備註說明
        /// </summary>
        public string Remark { get; set; }
        /// <summary>
        /// 容許上傳的文件類型 .mp4;.mov
        /// </summary>
        public string ExtendTypes { get; set; }
        /// <summary>
        /// 容許上傳文件最大長度(0不限制)
        /// </summary>
        public int maxLength { get; set; }

        /// <summary>
        /// 上傳路徑(前不帶/,後帶/ 例如:mobile/ 或 moblie/2013/)
        /// </summary>
        public string Path { get; set; }
        /// <summary>
        /// 路徑增長的時間格式化路徑 如:年月日 yyyy/MM/dd/ 注意最後一個帶/
        /// </summary>
        public string PathDateTimeFormat { get; set; }
        /// <summary>
        /// 縮放寬(圖片)
        /// </summary>
        public int ZoomWidth { get; set; }
        /// <summary>
        /// 縮放高(圖片)
        /// </summary>
        public int ZoomHeight { get; set; }

        /// <summary>
        /// 獲取完整路徑
        /// </summary>
        /// <returns></returns>
        public string GetFullPath()
        {
            string path = Path;
            if (!string.IsNullOrEmpty(this.PathDateTimeFormat))
            {
                path += DateTime.Now.ToString(this.PathDateTimeFormat);
            }
            return path;
        }
    }

定義完成類後,接下來看一下生成的配置文件,Upload.config。code

<?xml version="1.0"?>
<!--上傳文件配置-->
<Upload>
  <BasePath>http://192.168.2.101:9004/</BasePath>
  <FtpAddress>192.168.2.101</FtpAddress>
  <FtpPort>21</FtpPort>
  <FtpUser>ftp_user_9004</FtpUser>
  <FtpPwd>ftp_pwd_9004</FtpPwd>
  <UploadItem>
    <UploadItem>
      <Type>media</Type>
      <Remark>做品</Remark>
      <ExtendTypes>.mp4;.mov;.iso</ExtendTypes>
      <maxLength>10485760</maxLength>
      <Path>mobile/</Path>
      <PathDateTimeFormat>yyyy/MM/dd/</PathDateTimeFormat>
    </UploadItem>
    <UploadItem>
      <Type>mediaimg</Type>
      <Remark>做品截圖(封面)</Remark>
      <ExtendTypes>.jpg;.png</ExtendTypes>
      <maxLength>10485760</maxLength>
      <Path>mobile/</Path>
      <PathDateTimeFormat>yyyy/MM/dd/</PathDateTimeFormat>
    </UploadItem>
    <UploadItem>
      <Type>avatar</Type>
      <Remark>用戶頭像</Remark>
      <ExtendTypes>.jpg;.png</ExtendTypes>
      <maxLength>10485760</maxLength>
      <Path>mobile/</Path>
      <PathDateTimeFormat>yyyy/MM/dd/</PathDateTimeFormat>
    </UploadItem>
  </UploadItem>
</Upload>

各節點說明:

    主節點:

        BasePath:返回路徑的主域名路徑。

        FtpAddress:資源服務器上的ftp地址。

        FtpPort:ftp端口。

        FtpUser:ftp賬號。

        FtpPwd:ftp密碼。

    子節點:

        Type:類型,每個配置文件.config,肯定有且只有一個type名稱。type至關於數據庫表中的主鍵。

        Remark:標識,也是備註的意思方便之後在看這個節點時知道這個分類是用在什麼位置。

        ExtendTypes:容許上傳的文件類型,多個文件類型以「;」分割。

        maxLength:容許上傳的文件大小以kb爲單位。

        Path:相對路徑。

        PathDateTimeFormat:用來在Path路徑基礎上增長子目錄。在這裏目前只作了時間類型的處理。

        以第一個節點爲例,完整路徑是:http://192.168.2.101:9004/mobile/2013/10/01/xxx.mp4 這下應該明白了吧。

  對外提供接口,上面也提到了。全部的接口都在flash裏調用。總共須要兩個接口。

  第一個:獲取配置信息(即上傳文件大小、容許文件類型)

  第二個:上傳文件。這個就是普通的上傳接收文件信息了。在上傳完文件後,加了一個ftp服務,將文件上傳至相關的資源服務器上。此時上傳完成。將相關資源服務器路徑返回給flash。

配置文件和配置類都有了,接下咱們要獲取相關的配置信息。

/// <summary>
/// 獲取配置信息
/// </summary>
/// <param name="appconfig"></param>
/// <param name="type"></param>
/// <returns></returns>
protected Entity.Config.UploadItem getConfig(string appconfig, string type)
{
    string config_path = CommonHelper.WebConfig.GetWebConfig(string.Format("config:{0}", appconfig), "");
    if (!string.IsNullOrEmpty(config_path))
    {
        upload = ConfigCache.ConfigFactory.Instance.GetConfig<Entity.Config.Upload>(config_path);
        if (upload != null && upload.UploadItem != null)
        {
            return upload.UploadItem.FirstOrDefault(i => i.Type.Equals(type));
        }
    }
    return null;
}

接下來咱們就能夠實現第一個接口了,獲取配置信息:

/// <summary>
/// flash 獲取上傳的配置信息
/// </summary>
/// <param name="appconfig">配置文件名稱</param>
/// <param name="type">上傳節點名稱</param>
/// <returns></returns>
public ContentResult get_config(string appconfig, string type)
{
    var con = getConfig(appconfig, type);
    int maxlength = 0;
    string ext = "";
    if (con != null)
    {
        maxlength = con.maxLength;
        ext = con.ExtendTypes;
    }
    return Content(string.Format("{0}|{1}", maxlength, ext));
}

到目前爲止,咱們已經實現了第一個接口。接下實現第二個接口,也就是上傳文件的接口。

第一個接口中已經有了獲取上傳配置信息(get_config)的方法了。因此在上傳文件接口中直接使用get_config方法。

UploadItem config= getConfig(appconfig, type);

有了配置信息咱們就能夠對文件進行接收了先保存在臨時文件夾裏。相關方法就再也不粘貼了,網上有好多現成的例子。呵呵。

接下來須要將保存的文件經過ftp上傳至服務器上。上傳至服務器上的路徑在上面的 UploadItem 類中有實現,GetFullPath方法。

ftp相關的方法也再也不粘貼了。

嘿嘿,不少代碼在網上均可以找獲得,我只在將相關的代碼組合在一塊兒,方便本身使用,若是你們有須要能夠me我。

注:

一、CommonHelper.WebConfig類是對web.config訪問的一些方法封裝。簡單來講就是獲取配置信息。

二、ConfigCache.ConfigFactory.Instance 類是對 實體類 與 XML(.config) 文件序列化與反序列化操做。

相關文章
相關標籤/搜索