一、前言
1. 目前V5.0版本的文件服务器接口部分未进行封装,需要自己写代码实现上传与下载的功能。
2. 本篇将详细介绍移动端附件从数据库和文件服务器下载到本地临时目录。
二、正文
附件下载涉及以下几个步骤:
从数据库查询关联附件 => 下载至本地临时目录 => 使用控件进行展示
以下将介绍如果新建一张表单,并写插件来实现附件下载功能。
从新建一张表单开始
1. 登陆BOS IDE
2. 打开子系统
3. 新建移动表单
再添加一些控件
1. 添加按钮(通用控件),用于点击时下载附件
2. 添加多行文本,用于记录下载日志
3. 添加附件字段,用于展示下载后的附件
我们想要的功能,通过插件来实现
1. 这里附件下载逻辑涉及到以下几个点:
1.1 继《移动附件入门_上传篇》,我们采用InterId来作为附件关联标识。
1.2 获取本地临时目录,用于保存下载下来的附件
// 获取文件上传的临时目录
string tempDirPath = HttpContext.Current.Request.PhysicalApplicationPath + KeyConst.TEMPFILEPATH;
复制代码
1.3 如果附件是上传到文件服务器的,下载时还需要判断是否启用了文件服务器
// 获取文件服务器地址
var fileServerUrl = BusinessDataServiceHelper.GetFileServerUrl(this.Context);
bool usedFileServer = !fileServerUrl.IsNullOrEmptyOrWhiteSpace();
if (usedFileServer && !fileServerUrl.EndsWith("/"))
{
fileServerUrl += "/";
}
复制代码
1.4 最后通过this.Model.SetValue方法将数据绑定到控件上
2. 以下是完整的插件代码,供大家参考。
using Kingdee.BOS.Core;
using Kingdee.BOS.Core.Metadata;
using Kingdee.BOS.FileServer.Core;
using Kingdee.BOS.FileServer.Core.Utils;
using Kingdee.BOS.Mobile.Metadata.ControlDataEntity;
using Kingdee.BOS.Mobile.PlugIn;
using Kingdee.BOS.ServiceHelper;
using Kingdee.BOS.Util;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Net;
using System.Text;
using System.Web;
namespace Kingdee.BOS.Mobile.FormPlugIns.Test
{
/// <summary>
/// 附件下载测试
/// </summary>
/// <remarks>
/// 附件下载涉及以下步骤:
/// 1. 从数据库中读取关联标识的所有附件数据
/// 2. 根据FileStorage标识分别从数据库或文件服务器下载附件
/// 3. 将下载下来的附件保存到本地临时目录
/// </remarks>
[Description("测试附件下载")]
public class TestAccessoryDownload : AbstractMobilePlugin
{
public override void ButtonClick(Core.DynamicForm.PlugIn.Args.ButtonClickEventArgs e)
{
base.ButtonClick(e);
if ("FDownload".EqualsIgnoreCase(e.Key))
{
// 获取文件上传的临时目录
string tempDirPath = HttpContext.Current.Request.PhysicalApplicationPath + KeyConst.TEMPFILEPATH;
string interID = "D00001";// 继《移动附件入门_上传篇》中的关联单据/基础资料ID
// 加载数据库中附件数据
var filter = OQLFilter.CreateHeadEntityFilter(string.Format("FInterID = '{0}'", interID));
var dyns = BusinessDataServiceHelper.Load(this.Context, FormIdConst.BOS_Attachment, null, filter);
// 获取文件服务器地址
var fileServerUrl = BusinessDataServiceHelper.GetFileServerUrl(this.Context);
bool usedFileServer = !fileServerUrl.IsNullOrEmptyOrWhiteSpace();
if (usedFileServer && !fileServerUrl.EndsWith("/"))
{
fileServerUrl += "/";
}
List<File> fileList = new List<File>();
StringBuilder sb = new StringBuilder();
if (!usedFileServer)
{
sb.AppendLine("未启用文件服务器。");
}
foreach (var dyn in dyns)
{
// 拼接文件名
string fullName = System.IO.Path.Combine(tempDirPath, string.Format("{0}_{1}_{2}", this.Context.DBId, dyn["Id"], dyn["AttachmentName"]));
byte[] dataBuff = null;
if (Convert.ToInt16(dyn["FileStorage"]) == 1)
{
if (!usedFileServer)
{
// 未启用文件服务器,直接跳过
continue;
}
this.DownloadAttachment(fileServerUrl, Convert.ToString(dyn["FileId"]), fullName);
}
else
{
// 不是采用文件服务器存储,则尝试直接取数据
if (dyn["Attachment"] == null)
{
sb.AppendLine("未能下载附件:" + dyn["AttachmentName"]);
continue;
}
dataBuff = (byte[])dyn["Attachment"];
// 将附件保存至临时文件夹
System.IO.File.WriteAllBytes(fullName, dataBuff);
}
fileList.Add(new File() { Name = dyn["AttachmentName"].ToString(), Type = dyn["ExtName"].ToString() });
}
AccessoryData data = new AccessoryData()
{
FormId = this.View.BusinessInfo.GetForm().Id,
BillId = "Test001",
Data = fileList
};
this.Model.SetValue("FAccessoryField", data.ToJsonString());
if (fileList.Count > 0)
{
sb.AppendLine();
sb.AppendLine(string.Join(",", fileList.Select(f => f.Name)) + ",下载成功。");
}
this.Model.SetValue("FLog", sb.ToString());
}
}
/// <summary>
/// 下载附件
/// </summary>
/// <param name="fileServerUrl"></param>
/// <param name="fileId"></param>
/// <param name="fullName">这里是包含完整路径的文件名</param>
private void DownloadAttachment(string fileServerUrl, string fileId, string fullName)
{
string downloadUrl = string.Format("{0}download.aspx?fileId={1}&dbId={2}&t={3}",
fileServerUrl, fileId, this.Context.DBId, DateTime.Now.Ticks);
using (WebClient client = new WebClient())
{
client.DownloadFile(downloadUrl, fullName);
}
}
}
}
复制代码
推荐阅读