多项目上传文件解决方案之:服务器端

      关于服务器端,其实就是一个文件中转站,将客户端上传的文件先保存在服务器端的临时文件夹里,而后再经过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) 文件序列化与反序列化操做。

相关文章
相关标签/搜索