(17)uniGUI for C++ builder下如何实现文件上传与下载

(中行雷威2018.7.13于杭州西湖)

(同一个世界,同一个梦想,交流学习C++Builder XE10,传承c++builder的魅力!欢迎各地朋友加入我的QQ群484979943,进群密码“BCB”,同时也请将该群号广为宣传,希望能够广集各方高手,共同进步。如需下载开发工具及源代码请加入我的QQ群。)

【阅读倡议】

1、有问题请留言;

2、没问题请点赞;

3、看连载请加群;

4、下源码请加群;

【开发工具】

1、C++Builder10.2.2tokyo

2、FMSoft_uniGUI_Complete_Professional_1.10.0build1462(正版)

本例子将详细教授如何实现文件上传服务器,本教程的源代码清到我的QQ群共享文件A02-源代码里下载。

一、新建项目

1、新建项目,主目录d:\testLOADFILE

(17)uniGUI for C++ builder下如何实现文件上传与下载

2、在MainForm上放一个UniFileUpload文件上传控件和一个UniBitBtn1按钮控件。

(17)uniGUI for C++ builder下如何实现文件上传与下载

二、主要代码

#include <vcl.h>
#include <uniGUIVars.hpp>
#pragma hdrstop


#include "Main.h"
#include "MainModule.h"
#include "ServerModule.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "uniBitBtn"
#pragma link "uniButton"
#pragma link "uniFileUpload"
#pragma link "uniGUIBaseClasses"
#pragma link "uniGUIClasses"
#pragma resource "*.dfm"

1、上传按钮

void __fastcall TMainForm::UniBitBtn1Click(TObject *Sender)
{
UniFileUpload1->Execute();
}

2、上传事件

void __fastcall TMainForm::UniFileUpload1Completed(TObject *Sender, TFileStream *AStream)
{
AnsiString destPath,shortPath,destFile,fromFile;
fromFile=AStream->FileName.c_str();//上传控件自动将文件上传服务器后的数据流
destPath=UniServerModule()->FilesFolder+"工作指引" ;//可以在默认保存目录下再增加自定义子目录
shortPath="工作指引";
if(!DirectoryExists(destPath))//判断目标目录是否存在,不存在则创建。
{
ForceDirectories(destPath.c_str());
}
destFile=destPath+"\\"+ExtractFileName(UniFileUpload1->FileName);
if(0==CopyFile(fromFile.c_str(),destFile.c_str(), False)) //FALSE覆盖,将文件数据流保存成文件
{
ShowMessage("上传失败!");
}
else
{
ShowMessage("上传成功!");
}
}
//---------------------------------------------------------------------------

3、文件下载

UniSession->SendFile(UniServerModule()->FilesFolderPath+"通讯录.xls");

文件下载不多做解释,就一句话即可,但是经测试支持主流的文件类型,如.doc,.xls,.rar,.txt等,但是像.cyyy等非常规的文件类型不支持。(20180909补充)因浏览器安全属性,对一些不常用扩展名的文件限制下载,如何解决该问题呢?

void __fastcall TMainForm::UniBitBtn1Click(TObject *Sender)
{
UniSession->SendFile("a.txt");//能够正常下载
UniSession->SendFile("a.ttt");//点击下载没反应
}

如果需要,请将对应文件扩展名添加到Mime表中,比如添加对ttt扩展名类文件的下载支持,请在ServerModule的OnCreate中添加类型:

void __fastcall TUniServerModule::UniGUIServerModuleCreate(TObject *Sender)
{
MimeTable->AddMimeType("ttt","application/vnd.ms-outlook",False);
}
//---------------------------------------------------------------------------
另外,如果使用了HyperServer负载均衡,则要在hyper_server.cfg配置文件中如下添加:

[custom_mimes]
mime_0_ext=ttt
mime_0_type=application/ttt

三、运行效果

(17)uniGUI for C++ builder下如何实现文件上传与下载(17)uniGUI for C++ builder下如何实现文件上传与下载(17)uniGUI for C++ builder下如何实现文件上传与下载(17)uniGUI for C++ builder下如何实现文件上传与下载

上传成功了,但是文件保存到哪里去了呢?别着急,请到ServerModule-〉filesFolder属性下寻找

(17)uniGUI for C++ builder下如何实现文件上传与下载

(17)uniGUI for C++ builder下如何实现文件上传与下载

注意:FilesFolder目录一定要在你的项目运行的同级别目录下,支持多级别子目录、支持中文子目录。

上传对话框的文字属性和文件大小限制还有是否覆盖同名文件等属性,请在MainForm下的UniFileupload属性中设置。

(17)uniGUI for C++ builder下如何实现文件上传与下载