java下载另存为,windows客户端开发–根据可下载url另存为文件(微信windows客户端这样做的)...

可以我的blog的标题会让你误解,那么好,没图说了xx:

比如微信windows客户端发送了一张图片,我们可以预览这张图片,还可以保存到本地:

96f052989f860e977fc949aa8a68081f.png

那么windows程序是如何下载这张图片的呢?

是这样,别人给你发了一张图片,这张图片的原图会存在微信的服务器上,这样这个文件就对应了一个可下载的url。

如果你拿到了这个url,用浏览器访问,你就可以通过下载这个原图了。

但是,在浏览器下载是我们客户端控制不了的,下载路径也要在浏览器中设置,也不能方便的重命名。

那么这时候问题来了:

我们怎么样从一个url另存为这个文件呢?

9fa6141f6e72ab0a0168a504862c86cd.png

首先我们要弄出上面的另存为对话框吧,把文件要保存的位置,以及文件名都设置好了,点击确定后再开始下载。

另存为对话框就不细说了,直接上代码了:

OPENFILENAME opfn; WCHAR file_name[MAX_PATH] ; //wstring转WCHAR数组 swprintf(file_name, image_name_.size() + 1, L"%ls", image_name_.c_str()); ZeroMemory(&opfn, sizeof(OPENFILENAME)); opfn.lStructSize = sizeof(OPENFILENAME); //根据文件名取出后缀名 std::wstring file_extension_name = image_name_; size_t i = file_extension_name.rfind('.', file_extension_name.length()); if (i != string::npos) { file_extension_name = file_extension_name.substr(i + 1, file_extension_name.length() - i); } //设置另存为文件的默认后缀名 std::wstring default_ext = file_extension_name; opfn.lpstrDefExt = default_ext.c_str(); //设置筛选类型 file_extension_name = L"图片文件(*." + file_extension_name + L")"; opfn.lpstrFilter = file_extension_name.c_str(); opfn.nFilterIndex = 0; opfn.lpstrFile = file_name; opfn.nMaxFile = MAX_PATH; opfn.hwndOwner = m_hWnd; opfn.Flags = OFN_EXPLORER | OFN_PATHMUSTEXIST ; if (GetSaveFileName(&opfn)) { //开始下载文件 }

上面的另存为工作完成了,下面就差如何下载了:

查查windows API,结果出现了:

URLDownloadToFile

作用:

Downloads bits from the Internet and saves them to a file.

原型:

HRESULT URLDownloadToFile( LPUNKNOWN pCaller, LPCTSTR szURL, LPCTSTR szFileName, _Reserved_ DWORD dwReserved, LPBINDSTATUSCALLBACK lpfnCB );

参数就不过多介绍了,自己msdn吧!

最主要看下头文件和库:

Header Urlmon.h Library Urlmon.lib DLL Urlmon.dll

补齐上面的代码:

if (GetSaveFileName(&opfn)) { URLDownloadToFile(NULL, url, file_name, NULL, NULL); }

大功告成了~~等等,还有瑕疵:

再看看微信,如果另存为的名称已经存在,会有提示,而我们的程序没有:

7186ff34a65772c144d22e787aaf7e28.png

这里还需要设置一下OPENFILENAME 的Flags,其中有一个叫:

OFN_OVERWRITEPROMPT

opfn.Flags=OFN_EXPLORER | OFN_PATHMUSTEXIST |OFN_OVERWRITEPROMPT;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值