#region
|
|
using System;
|
using System.Data;
|
using System.Diagnostics;
|
using System.Drawing;
|
using System.Drawing.Imaging;
|
using System.IO;
|
using System.Threading;
|
using System.Windows.Forms;
|
using CSFrameworkV5.Common;
|
using CSFrameworkV5.Core;
|
using CSFrameworkV5.Interfaces;
|
using CSFrameworkV5.Models;
|
|
#endregion
|
|
namespace CSFrameworkV5.Business
|
{
|
public class AttachmentTool
|
{
|
/// <summary>
|
/// 由资料行的FileType(文件类型)字段创建图标
|
/// </summary>
|
/// <param name="sourceRow">资料行</param>
|
/// <param name="large">返回的大图标</param>
|
/// <param name="small">返回的小图标</param>
|
/// <param name="writeRow"></param>
|
public static void CreateFileIcon(DataRow sourceRow, out Icon large,
|
out Icon small, bool writeRow)
|
{
|
var fileType =
|
ConvertEx.ToString(sourceRow[tb_AttachFile.FileType]);
|
IconTool.CreateFileIcon(fileType, out large, out small);
|
|
if (writeRow)
|
{
|
var state = sourceRow.RowState;
|
|
if (large != null)
|
{
|
var ms1 = new MemoryStream();
|
large.ToBitmap().Save(ms1, ImageFormat.Bmp);
|
sourceRow[tb_AttachFile.IconLarge] = ms1.ToArray();
|
ms1.Close();
|
}
|
|
if (small != null)
|
{
|
var ms2 = new MemoryStream();
|
small.ToBitmap().Save(ms2, ImageFormat.Bmp);
|
sourceRow[tb_AttachFile.IconSmall] = ms2.ToArray();
|
ms2.Close();
|
}
|
|
if (state == DataRowState.Unchanged) sourceRow.AcceptChanges();
|
}
|
}
|
}
|
|
/// <summary>
|
/// 将附件存储在SQLServer
|
/// </summary>
|
public class AttachmentStorage_SQL : IAttachmentStorage
|
{
|
/// <summary>
|
/// 附件数据表
|
/// </summary>
|
private DataTable _attachmentStorage;
|
|
public AttachmentStorage_SQL()
|
{
|
}
|
|
public AttachmentStorage_SQL(DataTable attachmentStorage)
|
{
|
_attachmentStorage = attachmentStorage;
|
|
DoPrepareDataSource();
|
}
|
|
/// <summary>
|
/// 创建临时文件
|
/// </summary>
|
/// <param name="fileBuffer">文件数据</param>
|
/// <param name="fileName">文件名</param>
|
/// <returns></returns>
|
private string CreateTempFile(byte[] fileBuffer, string fileName)
|
{
|
if (fileBuffer == null || fileBuffer.Length == 0)
|
throw new CustomException("文件内容为空,无法打开文件!");
|
|
var path = Path.GetTempPath() + @"\" + fileName;
|
if (File.Exists(path)) File.Delete(path); //删除旧文件
|
|
var fs = new FileStream(path, FileMode.OpenOrCreate);
|
fs.Write(fileBuffer, 0, fileBuffer.Length);
|
fs.Flush();
|
fs.Close();
|
return path;
|
}
|
|
/// <summary>
|
/// 打开文件
|
/// </summary>
|
/// <param name="attachmentDataRow">当前选择的文件</param>
|
private void DoOpenFile(object attachmentDataRow)
|
{
|
try
|
{
|
var R = attachmentDataRow as DataRow;
|
var file = (byte[])R[tb_AttachFile.FileBody]; //取文件内容
|
var tempFile = CreateTempFile(file,
|
R[tb_AttachFile.FileName].ToStringEx());
|
var extension = Path.GetExtension(tempFile);
|
if (".jpg,.png,.bmp,.pdf,.doc,.docx,.xls,.xlsx,.txt,.zip,.rar"
|
.IndexOf(extension) >= 0)
|
{
|
var p = Process.Start(tempFile); //打开文件
|
if (p != null) p.WaitForExit();
|
|
File.Delete(tempFile);
|
}
|
else
|
{
|
throw new Exception("不支持的文件格式!");
|
}
|
}
|
catch (Exception ex)
|
{
|
Msg.ShowException(ex, "无法打开附件, 没有找到可以打开附件的程序!");
|
}
|
}
|
|
/// <summary>
|
/// 准备数据源用于表格显示,主要功能:自动生成显示图标。
|
/// </summary>
|
public void DoPrepareDataSource()
|
{
|
if (_attachmentStorage == null) return;
|
|
//临时显示字段
|
if (_attachmentStorage.Columns.IndexOf(tb_AttachFile.IconLarge) < 0)
|
_attachmentStorage.Columns.Add(tb_AttachFile.IconLarge,
|
typeof(byte[]));
|
|
if (_attachmentStorage.Columns.IndexOf(tb_AttachFile.IconSmall) < 0)
|
_attachmentStorage.Columns.Add(tb_AttachFile.IconSmall,
|
typeof(byte[]));
|
|
Icon large;
|
Icon small;
|
foreach (DataRow R in _attachmentStorage.Rows)
|
{
|
if (R.RowState == DataRowState.Deleted) continue;
|
|
if (R[tb_AttachFile.IconSmall] != DBNull.Value) continue;
|
|
AttachmentTool.CreateFileIcon(R, out large, out small,
|
true); //创建图标,用于表格显示
|
}
|
}
|
|
#region IAttachmentStorage Members
|
|
public DataTable AttachmentStorage
|
{
|
get => _attachmentStorage;
|
set
|
{
|
_attachmentStorage = value;
|
DoPrepareDataSource();
|
}
|
}
|
|
public void Save()
|
{
|
}
|
|
private void DeleteAll()
|
{
|
foreach (DataRow R in _attachmentStorage.Rows) R.Delete();
|
}
|
|
private byte[] GetFile(string fileName)
|
{
|
var rows = _attachmentStorage.Select("FileName='" + fileName + "'");
|
if (rows.Length > 0) return (byte[])rows[0][tb_AttachFile.FileBody];
|
|
return null;
|
}
|
|
/// <summary>
|
/// 调用相关程序打开附件
|
/// </summary>
|
public void OpenFile(string fileName)
|
{
|
var rows = _attachmentStorage.Select("FileName='" + fileName + "'");
|
if (rows.Length > 0)
|
{
|
//调用线程打开文件
|
var td = new Thread(DoOpenFile);
|
td.Start(rows[0]);
|
}
|
else
|
{
|
Msg.Warning("没有选择附件!");
|
}
|
}
|
|
public void DeleteFile(string fileName)
|
{
|
var rows = _attachmentStorage.Select("FileName='" + fileName + "'");
|
if (rows.Length > 0) rows[0].Delete();
|
}
|
|
public bool Exists(string fileName)
|
{
|
var rows = _attachmentStorage.Select("FileName='" + fileName + "'");
|
return rows.Length > 0;
|
}
|
|
public void SaveAs(string fileName)
|
{
|
var rows = _attachmentStorage.Select("FileName='" + fileName + "'");
|
if (rows.Length > 0)
|
try
|
{
|
var R = rows[0];
|
var file = (byte[])R["FileBody"]; //取文件内容
|
var tempFile =
|
CreateTempFile(file, R["FileName"].ToStringEx());
|
|
var dlg = new SaveFileDialog();
|
dlg.FileName = R["FileName"].ToStringEx();
|
if (DialogResult.OK == dlg.ShowDialog())
|
{
|
File.Copy(tempFile, dlg.FileName, true);
|
Msg.ShowInformation("保存成功!文件:" + dlg.FileName);
|
}
|
|
File.Delete(tempFile);
|
}
|
catch
|
{
|
Msg.Warning("无法打开附件, 没有找到可以打开附件的程序!");
|
}
|
else
|
Msg.Warning("没有选择附件!");
|
}
|
|
public void AddFile(object file)
|
{
|
var f = file as TAttachFile;
|
var row = _attachmentStorage.NewRow();
|
row[tb_AttachFile.DocID] = "";
|
row[tb_AttachFile.FileTitle] = f.FileTitle;
|
row[tb_AttachFile.FileName] = f.FileName;
|
row[tb_AttachFile.FileType] = f.FileType;
|
row[tb_AttachFile.FileSize] = f.FileSize;
|
row[tb_AttachFile.FileBody] = f.FileBody;
|
row[tb_AttachFile.IsDroped] = f.IsDroped;
|
row[tb_AttachFile.IconLarge] = f.IconLarge;
|
row[tb_AttachFile.IconSmall] = f.IconSmall;
|
_attachmentStorage.Rows.Add(row);
|
}
|
|
public void AddFile(string fileFullName)
|
{
|
FileStream fs = null;
|
|
try
|
{
|
var ext = Path.GetExtension(fileFullName); //扩展名
|
var fileName = Path.GetFileName(fileFullName); //显示文件名称
|
|
fs = new FileStream(fileFullName, FileMode.Open);
|
var bs = new byte[fs.Length]; //文件内容
|
fs.Read(bs, 0, (int)fs.Length); //读取文件内容
|
var size =
|
decimal.Round((decimal)(fs.Length / 1024.00),
|
2); //文件大小 kb
|
fs.Close();
|
|
//显示文件的图标
|
Icon large;
|
Icon small;
|
IconTool.CreateFileIcon(ext, out large, out small); //获取文件的图标
|
|
var file = new TAttachFile(); //附件对象
|
file.FileName = fileName;
|
file.FileTitle = fileName; //文件标题
|
file.FileType = ext; ////扩展名
|
file.FileSize = size;
|
file.FileBody = bs;
|
|
if (large != null)
|
file.IconLarge =
|
IconTool.ImageToByte(large.ToBitmap()); //大图标
|
|
if (small != null)
|
file.IconSmall =
|
IconTool.ImageToByte(small.ToBitmap()); //小图标
|
|
AddFile(file); //保存数据
|
}
|
catch
|
{
|
if (fs != null) fs.Close();
|
}
|
}
|
|
public void UpdateFile(object file)
|
{
|
var f = file as TAttachFile;
|
var rows =
|
_attachmentStorage.Select("FileID=" +
|
f.FileID.ToStringEx()); //查找旧记录
|
if (rows.Length > 0)
|
{
|
var row = rows[0];
|
row[tb_AttachFile.DocID] = "";
|
row[tb_AttachFile.FileTitle] = f.FileTitle;
|
row[tb_AttachFile.FileName] = f.FileName;
|
row[tb_AttachFile.FileType] = f.FileType;
|
row[tb_AttachFile.FileSize] = f.FileSize;
|
row[tb_AttachFile.FileBody] = f.FileBody;
|
row[tb_AttachFile.IsDroped] = f.IsDroped;
|
row[tb_AttachFile.IconLarge] = f.IconLarge;
|
row[tb_AttachFile.IconSmall] = f.IconSmall;
|
}
|
}
|
|
#endregion
|
}
|
|
/// <summary>
|
/// 将附件存在共享目录
|
/// </summary>
|
public class AttachmentStorage_Folder : IAttachmentStorage
|
{
|
#region IAttachmentStorage Members
|
|
public DataTable AttachmentStorage { get; set; }
|
|
public void Save()
|
{
|
}
|
|
public void DeleteAll()
|
{
|
}
|
|
public byte[] GetFile(string fileName)
|
{
|
return null;
|
}
|
|
public void OpenFile(string fileName)
|
{
|
}
|
|
public void DeleteFile(string fileName)
|
{
|
}
|
|
public bool Exists(string fileName)
|
{
|
return false;
|
}
|
|
public void AddFile(object file)
|
{
|
}
|
|
public void AddFile(string fileFullName)
|
{
|
}
|
|
public void UpdateFile(object file)
|
{
|
}
|
|
public void SaveAs(string fileName)
|
{
|
}
|
|
#endregion
|
}
|
|
/// <summary>
|
/// 对象工厂
|
/// </summary>
|
public class AttachmentFactory
|
{
|
public IAttachmentStorage CreateEmptyStorage()
|
{
|
return new AttachmentStorage_SQL();
|
}
|
}
|
}
|