DownFile

一、准备工作:首先在云端代码上添加事件 _downfile() 并启动。

1
2
3
4
5
6
7
bool _downfile(string&in from, string&out msg)
{
    Print("_downfile, from:"+from+"\n");
   
    msg = "this is downfile return msg";
    return true;
}

二、Windows客户端执行以下代码:
在头文件定义消息宏和消息函数(如果不需要接收进度消息则不定义):

1
2
#define WM_USER_MSG_DOWN_FILE       WM_USER + 1001  // 文件下载进度消息
afx_msg LRESULT OnMsgDwonFile(WPARAM w,LPARAM l); // 消息函数
1
2
3
4
//进行消息映射
BEGIN_MESSAGE_MAP(CdemoDlg, CDialogEx)
    ON_MESSAGE(WM_USER_MSG_UP_FILE,&CdemoDlg::OnMsgDownFile) // 下载进度消息
END_MESSAGE_MAP()

接收消息的函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
LRESULT CdemoDlg::OnMsgDownFile(WPARAM w,LPARAM l)
{
    std::string* strMsg = (std::string*)l;
    Json::Value root;
    Json::Reader r;
    if(r.parse(*strMsg,root))
    {
        char tmp[256] = {0};
        double dPercent = root["task_percent"].asDouble();
        m_progressUp.SetPos(dPercent);

        // 设置标签百分率
        sprintf(tmp,"%0.2lf %%",dPercent);
        CString strPercent = CStrWorker::CharToCString(tmp);
        m_staticUp.SetWindowText(strPercent);
    }

    return TRUE;
}

下载代码:

1
2
3
4
5
6
7
8
9
10
11
void CdemoDlg::OnBnClickedBtnDown()
{
    CString strFilePath = L"1.jpg", strSaveFilePath = L"C:\\1.jpg", strTaskToken = L"my_down_task";
    BOOL bExistFail = TRUE, bSendApp = TRUE;
    std::wstring out_res = "";
    BOOL b = m_client.DownFileW(strFilePath,strSaveFilePath,strTaskToken,bExistFail,bSendApp,&out_res,this,WM_USER_MSG_DOWN_FILE);
    if(b)
        AfxMessageBox(L"下载成功");
    else
        AfxMessageBox(L"下载失败");
}

三、Linux客户端执行以下代码:
定义接收下载进度消息的函数:

1
2
3
4
void RecvDownFileMsg(const char* buff, int len)
{
    tprintf("接收到下载进度消息:%s\n",buff);
}

下载代码:

1
2
3
4
5
6
7
std::string strLocalPath = "/tmp/1.jpg", strSerFileName = "1.jpg",strTaskToken = "my_down_file";
std::string out_res = "";
bool b = m_client.DownFile(strSerFileName .c_str(),strLocalPath .c_str(),strTaskToken.c_str(),true,true,&out_res,RecvDownFileMsg);
if(!b)
    printf("client 下载文件失败, err:%s\n",m_client.GetLastError().c_str());
else
    printf("client 下载文件成功, 返回数据:%s\n",out_res.c_str());

四、Android客户端执行以下代码:
继承并注册消息接收器(客户端收到的所有消息都在消息接收器这里处理, 只需要注册1次, 后者覆盖前者):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// 消息接收器代码(需要导入jar包和so)
import com.bovey.android.MsgRecver;

public class MyMsgRecver extends MsgRecver{
    @Override
    public void RecvMsg(String msg) {
        // TODO Auto-generated method stub
        super.RecvMsg(msg);
       
        Log.v("my recv msg", "msg:"+msg);
    }

    @Override
    public void RecvUpMsg(String msg) {
        // TODO Auto-generated method stub
        super.RecvUpMsg(msg);
       
        Log.v("my recv up msg", "msg:"+msg);
    }

    @Override
    public void RecvDownMsg(String msg) {
        // TODO Auto-generated method stub
        super.RecvDownMsg(msg);
       
        Log.v("my recv down msg", "msg:"+msg);
    }
}
1
2
3
4
5
6
7
// 注册代码
MyMsgRecver m_msgRecver = new MyMsgRecver();
boolean b = m_client.RegRecver(m_msgRecver);
if(b)
    Log.i("reg ok", "recv:"+out_str.toString());
else
    Log.e("reg fail", "err:"+m_client.GetLastError());

下载代码:

1
2
3
4
5
6
7
8
9
String strLocalPath = Environment.getExternalStorageDirectory().getPath() + "/1.jpg";
String strServerName = "1.jpg";
String strTaskToken = "my_down_task";
CString out_res = new CString();
boolean b = m_client.DownFile(strServerName, strLocalPath, strTaskToken, true, true, out_res);
if(b)
    Log.i("down file ok", "recv:"+out_str.toString());
else
    Log.e("down file fail", "err:"+m_client.GetLastError());

至此,文件下载完成,感谢您的查阅,希望可以帮到您。

发表评论

电子邮件地址不会被公开。 必填项已用*标注