【分享】移动附件下载
金蝶云社区-emily
emily
3人赞赏了该文章 2,350次浏览 未经作者许可,禁止转载编辑于2018年08月29日 19:46:09
summary-icon摘要由AI智能服务提供

本文分为两部分,首先简要说明将分别讲解移动端附件的上传与下载功能,本篇专注于下载功能。详细阐述了在移动端实现附件下载的开发教程,包括从数据库或文件服务器下载附件的步骤,如查询关联附件、下载至本地临时目录、使用控件展示等。通过BOS IDE新建表单并添加控件,利用插件实现下载逻辑,包括确定单据、获取临时目录、判断文件存储位置并下载、保存至本地及数据绑定等,并提供了完整的插件代码示例。

一、前言
1. 为了明晰上传与下载功能的讲解,这里将分两篇文章来分别讲解上传与下载功能。
2. 本篇将完整讲解如何实现移动端的附件下载功能:    
  2.1 从数据库下载附件
  2.2 从文件服务器下载附件
3. 相关链接详见文章末尾。

二、移动附件下载开发教程
附件下载涉及以下几个步骤:
从数据库查询关联附件 => 下载至本地临时目录 => 使用控件进行展示

以下将进行逐步构建和讲解:
从新建一张表单开始
1. 登陆BOS IDE
2. 打开子系统
3. 新建移动表单
新建表单.jpg 
再添加一些控件
1. 添加按钮(通用控件),用于点击时下载附件
添加按钮控件.jpg 
2. 添加多行文本,用于记录下载日志
添加多行文本控件.jpg 
3. 添加附件字段,用于展示下载后的附件
添加附件字段.jpg 
我们想要的功能,通过插件来实现
1. 这里附件下载逻辑涉及到以下几个点:
1.1 继《移动附件入门_上传篇》,我们采用BillType和InterId组合来确定一张单据,并以此作为附件关联标识。
1.2 获取本地临时目录,用于保存下载下来的附件

  1. // 获取文件上传的临时目录

  2. string tempDirPath = HttpContext.Current.Request.PhysicalApplicationPath + KeyConst.TEMPFILEPATH;

复制代码

1.3 如果附件是上传到文件服务器的,下载时还需要判断是否启用了文件服务器

  1. // 判断是否启用文件服务器

  2. if (Kingdee.BOS.ServiceHelper.FileServer.FileServerHelper.UsedFileServer(this.Context))

  3. {

  4.     // TODO:从文件服务器下载附件

  5. }

复制代码

1.4 最后通过this.Model.SetValue方法将数据绑定到控件上
2. 以下是完整的插件代码,供大家参考。

  1. using Kingdee.BOS.Core;

  2. using Kingdee.BOS.Core.Metadata;

  3. using Kingdee.BOS.FileServer.Core.Object;

  4. using Kingdee.BOS.FileServer.ProxyService;

  5. using Kingdee.BOS.KDThread;

  6. using Kingdee.BOS.Mobile.Metadata.ControlDataEntity;

  7. using Kingdee.BOS.Mobile.PlugIn;

  8. using Kingdee.BOS.ServiceHelper;

  9. using Kingdee.BOS.Util;

  10. using System;

  11. using System.Collections.Generic;

  12. using System.ComponentModel;

  13. using System.Linq;

  14. using System.Text;

  15. using System.Web;


  16. namespace Kingdee.BOS.Mobile.FormPlugIns.Test

  17. {

  18.     /// <summary>

  19.     /// 附件下载测试

  20.     /// </summary>

  21.     /// <remarks>

  22.     /// 附件下载涉及以下步骤:

  23.     /// 1. 从数据库中读取关联标识的所有附件数据

  24.     /// 2. 根据FileStorage标识分别从数据库或文件服务器下载附件

  25.     /// 3. 将下载下来的附件保存到本地临时目录

  26.     /// </remarks>

  27.     [Description("测试附件下载")]

  28.     public class TestAccessoryDownload : AbstractMobilePlugin

  29.     {

  30.         public override void ButtonClick(Core.DynamicForm.PlugIn.Args.ButtonClickEventArgs e)

  31.         {

  32.             if ("FDownload".EqualsIgnoreCase(e.Key))

  33.             {

  34.                 // 获取文件上传的临时目录

  35.                 string tempDirPath = HttpContext.Current.Request.PhysicalApplicationPath + KeyConst.TEMPFILEPATH;


  36.                 // 结合《移动附件入门_上传篇》中的虚拟FromID和虚拟内码结合来确定是哪一张单据

  37.                 string billType = "Test_MOB_Accessory";// 关联单据的FormID

  38.                 string interID = "D00001";// 关联单据/基础资料ID


  39.                 // 加载数据库中附件数据

  40.                 var filter = OQLFilter.CreateHeadEntityFilter(string.Format("FBillType = '{0}' AND FInterID = '{1}'", billType, interID));

  41.                 var dyns = BusinessDataServiceHelper.Load(this.Context, FormIdConst.BOS_Attachment, null, filter);


  42.                 List<File> fileList = new List<File>();

  43.                 StringBuilder sb = new StringBuilder();

  44.                 foreach (var dyn in dyns)

  45.                 {

  46.                     byte[] dataBuff = null;

  47.                     if (Convert.ToInt16(dyn["FileStorage"]) != 0)

  48.                     {

  49.                         // 判断是否启用文件服务器

  50.                         if (Kingdee.BOS.ServiceHelper.FileServer.FileServerHelper.UsedFileServer(this.Context))

  51.                         {

  52.                             // 采用文件服务器存储

  53.                             var service = new UpDownloadService();

  54.                             TFileInfo tFile = new TFileInfo()

  55.                             {

  56.                                 FileId = dyn["FileId"].ToString(),

  57.                                 CTX = this.Context

  58.                             };

  59.                             dataBuff = service.GetFileData(tFile);

  60.                         }

  61.                     }

  62.                     else

  63.                     {

  64.                         // 不是采用文件服务器存储,则尝试直接取数据

  65.                         if (dyn["Attachment"] != null)

  66.                         {

  67.                             dataBuff = (byte[])dyn["Attachment"];

  68.                         }

  69.                     }


  70.                     if (dataBuff == null)

  71.                     {

  72.                         sb.AppendLine("未能下载附件:" + dyn["AttachmentName"]);

  73.                         continue;

  74.                     }


  75.                     var tempFileName = string.Format("{0}_{1}_{2}", this.Context.DBId, dyn["Id"], dyn["AttachmentName"]);

  76.                     // 拼接文件名

  77.                     string fullName = System.IO.Path.Combine(tempDirPath, tempFileName);

  78.                     // 将附件保存至临时文件夹

  79.                     System.IO.File.WriteAllBytes(fullName, dataBuff);

  80.                     fileList.Add(new File() { Name = tempFileName, Type = dyn["ExtName"].ToString() });

  81.                 }


  82.                 AccessoryData data = new AccessoryData()

  83.                 {

  84.                     FormId = this.View.BusinessInfo.GetForm().Id,

  85.                     BillId = "Test001",

  86.                     Data = fileList

  87.                 };


  88.                 this.Model.SetValue("FAccessoryField", data.ToJsonString());

  89.                 if (fileList.Count > 0)

  90.                 {

  91.                     sb.AppendLine();

  92.                     sb.AppendLine(string.Join(",", fileList.Select(f => f.Name)) + ",下载成功。");

  93.                 }

  94.                 this.Model.SetValue("FLog", sb.ToString());

  95.             }


  96.             base.ButtonClick(e);

  97.         }

  98.     }

  99. }


复制代码


图标赞 3
3人点赞
还没有人点赞,快来当第一个点赞的人吧!
图标打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!