可以我的blog的标题会让你误解,那么好,没图说了xx:
比如微信windows客户端发送了一张图片,我们可以预览这张图片,还可以保存到本地:
那么windows程序是如何下载这张图片的呢?
是这样,别人给你发了一张图片,这张图片的原图会存在微信的服务器上,这样这个文件就对应了一个可下载的url。
如果你拿到了这个url,用浏览器访问,你就可以通过下载这个原图了。
但是,在浏览器下载是我们客户端控制不了的,下载路径也要在浏览器中设置,也不能方便的重命名。
那么这时候问题来了:
我们怎么样从一个url另存为这个文件呢?
首先我们要弄出上面的另存为对话框吧,把文件要保存的位置,以及文件名都设置好了,点击确定后再开始下载。
另存为对话框就不细说了,直接上代码了:
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);
}
大功告成了~~等等,还有瑕疵:
再看看微信,如果另存为的名称已经存在,会有提示,而我们的程序没有:
这里还需要设置一下OPENFILENAME 的Flags,其中有一个叫:
OFN_OVERWRITEPROMPT
opfn.Flags = OFN_EXPLORER | OFN_PATHMUSTEXIST |OFN_OVERWRITEPROMPT;