能够我的blog的标题会让你误解,那么好,没图说了xx:
比方微信windowsclient发送了一张图片,我们能够预览这张图片,还能够保存到本地:那么windows程序是怎样下载这张图片的呢?
是这样。别人给你发了一张图片。这张图片的原图会存在微信的server上,这样这个文件就相应了一个可下载的url。
假设你拿到了这个url,用浏览器訪问。你就能够通过下载这个原图了。
可是。在浏览器下载是我们client控制不了的。下载路径也要在浏览器中设置。也不能方便的重命名。
那么这时候问题来了:
我们怎么样从一个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.hLibrary Urlmon.libDLL Urlmon.dll
补齐上面的代码:
if (GetSaveFileName(&opfn)) { URLDownloadToFile(NULL, url, file_name, NULL, NULL); }
大功告成了~~等等,还有瑕疵:
再看看微信,假设另存为的名称已经存在,会有提示。而我们的程序没有:这里还须要设置一下OPENFILENAME 的Flags,当中有一个叫:
OFN_OVERWRITEPROMPTopfn.Flags = OFN_EXPLORER | OFN_PATHMUSTEXIST |OFN_OVERWRITEPROMPT;