起步软件技术论坛-X3

 找回密码
 立即注册
搜索
12
返回列表 发新帖
楼主: Coordinator

附件如何保存在服务器上?如何读取?**

[复制链接]
发表于 2007-1-31 13:14:28 | 显示全部楼层
拜托,有人关注这个问题么 ?
回复 支持 反对

使用道具 举报

发表于 2007-1-31 14:24:17 | 显示全部楼层
又一个小时过去了。
一直等待中...
回复 支持 反对

使用道具 举报

发表于 2007-1-31 16:24:22 | 显示全部楼层
给一个直接存到数据库中的解决方案

//用于上传、打开、另存、清除附件
  TFileDoc = class(TObject)
  private
    FName: string;
    FExpName: string;
    FFlowField :string;                     //非结构化二进制流字段名称
    FFileNameField :string;                 //用于存储上传文件名的字段名称
    FContent: TMemoryStream;
    FRefDataSet: TSQLDataSet;
  protected
    //
  public
    constructor Create(ADataSet: TSQLDataSet;FlowField,FileNameField:String);
    destructor Destroy; override;
    procedure LoadFromDB;
    procedure LoadFromFile(const AFileName: string);
    procedure SaveToFile(const AFileName: string);
    procedure SaveToDB;
    procedure UploadExecute;     //上传附件
    procedure OpenExecute;       //打开附件
    procedure SaveAsExecute;     //另存附件
    procedure ClearExecute;      //清除附件

    property Content: TMemoryStream read FContent;
    property Name: string read FName write FName;
    property ExpName: string read FExpName write FExpName;
  end;
  
  
  
//TFileDoc类
constructor TFileDoc.Create(ADataSet: TSQLDataSet;FlowField,FileNameField:string);
begin
  inherited create;
  FRefDataSet :=ADataSet;
  FFlowField :=FlowField;
  FFileNameField :=FileNameField;
  FContent := TMemoryStream.Create;
end;

destructor TFileDoc.Destroy;
begin
  FContent.Free;
  inherited;
end;

procedure TFileDoc.LoadFromDB;
var
  lBlobField: TBlobField;
begin
  FContent.Clear;
  FContent.Position := 0;
  if not FRefDataSet.Eof then
  begin
    lBlobField :=TBlobField(FRefDataSet.FieldByName(FFlowField));
    lBlobField.SaveToStream(FContent);
  end;
end;

procedure TFileDoc.LoadFromFile(const AFileName: string);
begin
  if SysUtils.FileExists(AFileName) then
  begin
    FContent.LoadFromFile(AFileName);
  end
  else
    jsDialogs.ShowWarning(SysUtils.Format('文件%s不存在', [AFileName]),'');
end;

procedure TFileDoc.SaveToFile(const AFileName: string);
begin
  FContent.SaveToFile(AFileName);
end;

procedure TFileDoc.SaveToDB;
var
  lBlobField: TBlobField;
begin
  try
    if not (FRefDataSet.State in [TDatasetState.dsInsert,TDataSetState.dsedit]) then
      FRefDataSet.Edit;
    FRefDataSet.FieldByName(FFileNameField).AsString := Name + '.' + ExpName;
    lBlobField := TBlobField(FRefDataSet.FieldByName(FFlowField));
    Content.Position := 0;
    lBlobField.LoadFromStream(Content);
    FRefDataSet.Post;
  except
    raise Exception.Create('上传失败!');
  end;
end;

procedure TFileDoc.UploadExecute;
var
  lOpenDialog: TOpenDialog;
begin
  lOpenDialog := TOpenDialog.Create(nil);
  try
    if lOpenDialog.Execute then
    begin
      Name := JSSysUtils.ExtractOnlyFileName(lOpenDialog.FileName);
      ExpName := JSSysUtils.GetFileExt(lOpenDialog.FileName);
      LoadFromFile(lOpenDialog.FileName);
      SaveToDB;
    end
    else
      SysUtils.Abort;
  finally
    lOpenDialog.Free;
  end;
end;

procedure TFileDoc.OpenExecute;
var
  lTempFileName: string;
begin
  if FRefDataSet.FieldByName(FFileNameField).AsString='' then
  begin
    jsdialogs.ShowMsg('当前单据还没有上传附印件,请先上传!','');
    sysutils.Abort;
  end ;
  LoadFromDB;
  lTempFileName := JSSysUtils.GetSystemTempPath + FRefDataSet.FieldByName(FFileNameField).AsString;
  if SysUtils.FileExists(lTempFileName) then
    SysUtils.DeleteFile(lTempFileName);
  SaveToFile(lTempFileName);
  Borland.Delphi.ShellAPI.ShellExecute(0, 'open',
    PChar(lTempFileName), '', '', Borland.Delphi.Windows.SW_SHOW);
end;

procedure TFileDoc.SaveAsExecute;
var
  lFileName: string;
begin
  lFileName := FRefDataSet.FieldByName(FFileNameField).AsString;
  if (lFileName = '') or (lFileName = nil) then
  begin
   jsdialogs.ShowMsg('当前单据还没有上传附印件,请先上传!','');
   sysutils.Abort;
  end ;
  LoadFromDB;
  with Business.Forms.TSaveDialog.Create(nil) do
  begin
    FileName := lFileName;
    if Execute then
    begin
      if SysUtils.FileExists(FileName) then
        if not jsDialogs.ConfirmBox('文件已经存在是否覆盖?', '', 1) then
        begin
          SysUtils.DeleteFile(FileName);
          Exit;
        end;
      SaveToFile(FileName);
    end;
  end;
end;

procedure TFileDoc.ClearExecute;
var
  lBlobField: TBlobField;
begin
  try
    if not (FRefDataSet.State in [TDatasetState.dsInsert,TDataSetState.dsedit]) then
      FRefDataSet.Edit;
    FRefDataSet.FieldByName(FFileNameField).clear;
    lBlobField := TBlobField(FRefDataSet.FieldByName(FFlowField));
    lBlobField.Clear;
    FRefDataSet.ApplyUpdates;
  except
    raise Exception.Create('清除失败!');
  end;
end;  


-------------具体用法
---上传附件---
procedure TBIZDOC.ActUploadExecute(Sender: TObject);
var
  lFileDoc : TFileDoc;
begin
  lFileDoc :=TFileDoc.Create(TSQLDataSet(dsbBizDocMaster.DataSet),'OldOrderFormManifold','AccessoriesName');
           //OldOrderFormManifold 用于存附件的二进制流类型的字段,AccessoriesName用于存附件名称的字符型字段
  try
    lFileDoc.UploadExecute;
  finally
    lFileDoc.free;
  end;
end;

----打开附件----
procedure TBIZDOC.btnOpenClick(Sender: TObject);
var
  lFileDoc : TFileDoc;
begin
  lFileDoc :=TFileDoc.Create(TSQLDataSet(dsbBizDocMaster.DataSet),'OldOrderFormManifold','AccessoriesName');
  try
    lFileDoc.OpenExecute;
  finally
    lFileDoc.free;
  end;
end;

-----另存附件-----
procedure TBIZDOC.btnSaveASClick(Sender: TObject);
var
  lFileDoc : TFileDoc;
begin
  lFileDoc :=TFileDoc.Create(TSQLDataSet(dsbBizDocMaster.DataSet),'OldOrderFormManifold','AccessoriesName');
  try
    lFileDoc.SaveAsExecute;
  finally
    lFileDoc.Free;
  end;
end;
回复 支持 反对

使用道具 举报

发表于 2007-1-31 16:29:47 | 显示全部楼层
如果我要上传的附件 特别大呢?
如果用别的方法,
我在查询的时候,
还可以查看到附件的内容么?
回复 支持 反对

使用道具 举报

发表于 2007-1-31 19:18:41 | 显示全部楼层
6楼不是给了文件大的时候的解决方法了吗?
查看的时候,要先下载的到客户端本地,然后显示出来看
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-2-6 10:04:00 | 显示全部楼层
6楼是说先把大的附件用ftp上传到服务器上吗? 是在x3系统里实现吗? 有具体的方法吗? 谢谢
回复 支持 反对

使用道具 举报

发表于 2007-2-6 11:14:26 | 显示全部楼层
4楼给出了把文件放到共享目录,然后在表中记录路径的代码,你只要把拷贝文件的代码换成FTP的代码就可以了。
FTP的代码就要用到外部控件来实现了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2024-12-24 09:05 , Processed in 0.040314 second(s), 13 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表