zoukankan      html  css  js  c++  java
  • C++ 根据图片url 批量 下载图片

    最近需要用到根据图片URL批量下载到本地的操作。查找了相关资料,记录在这儿。

    1.首先在CSV文件中提取出url

        ifstream fin("C:\Users\lenovo\Desktop\query_result0503.csv"); //打开文件流操作  
        string line;
    
        int cnt = 0;
        while (getline(fin, line) && cnt < 20)  
        {
            istringstream sin(line); //将整行字符串line读入到字符串流istringstream中  
            vector<string> urls; 
            string url;
            while (getline(sin, url, ',')) //以逗号为分隔符  
            {
                urls.push_back(url); 
            }
            
            cnt++;
            size_t found =     urls[0].find_last_of("/\");
            if (found == string::npos) continue;
            string imgname = urls[0].substr(found+1);
            cout << "处理后:" << urls[0] << "----" <<cnt<<"----" <<imgname << endl;
       }

    2.根据URL将图片保存到本地。

    需要用到 URLDownloadToFile函数 。

    踩的坑主要是 这个函数需要用到宽字符参数。。如果参数类型不正确。。那么你甭想下载得到正确文件。。。

    需要用到 MultiByteToWideChar函数来转换一下。。。。

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

    Parameters

    • pCaller
      A pointer to the controlling IUnknown interface of the calling ActiveX component, if the caller is an ActiveX component. If the calling application is not an ActiveX component, this value can be set to NULL. Otherwise, the caller is a COM object that is contained in another component, such as an ActiveX control in the context of an HTML page. This parameter represents the outermost IUnknown of the calling component. The function attempts the download in the context of the ActiveX client framework, and allows the caller container to receive callbacks on the progress of the download.

    • szURL
      A pointer to a string value that contains the URL to download. Cannot be set to NULL. If the URL is invalid, INET_E_DOWNLOAD_FAILURE is returned.

    • szFileName
      A pointer to a string value containing the name or full path of the file to create for the download. If szFileNameincludes a path, the target directory must already exist.

    • dwReserved
      Reserved. Must be set to 0.

    • lpfnCB
      A pointer to the IBindStatusCallback interface of the caller. By using IBindStatusCallback::OnProgress, a caller can receive download status. URLDownloadToFile calls the IBindStatusCallback::OnProgress and IBindStatusCallback::OnDataAvailable methods as data is received. The download operation can be canceled by returning E_ABORT from any callback. This parameter can be set to NULL if status is not required.

    Return value

    This function can return one of these values.

    Return codeDescription
    S_OK

    The download started successfully.

    E_OUTOFMEMORY

    The buffer length is invalid, or there is insufficient memory to complete the operation.

    INET_E_DOWNLOAD_FAILURE

    The specified resource or callback interface was invalid.

    ///
            size_t len = urls[0].length();//获取字符串长度
            int nmlen = MultiByteToWideChar(CP_ACP, 0, urls[0].c_str(), len + 1, NULL, 0);//如果函数运行成功,并且cchWideChar为零,
                                                                                      //返回值是接收到待转换字符串的缓冲区所需求的宽字符数大小。
            wchar_t* buffer = new wchar_t[nmlen];
            MultiByteToWideChar(CP_ACP, 0, urls[0].c_str(), len + 1, buffer, nmlen);
    
    
            string savepath = "C:\Users\lenovo\Desktop\csvfile\query_result0423\"+imgname;
            size_t len1 = savepath.length();
            wchar_t* imgsavepath = new wchar_t[len1];
            int nmlen1 = MultiByteToWideChar(CP_ACP, 0, savepath.c_str(), len1 + 1, NULL, 0);
            MultiByteToWideChar(CP_ACP, 0, savepath.c_str(), len1 + 1, imgsavepath, nmlen1);
            
            
            HRESULT hr = URLDownloadToFile(NULL, buffer, imgsavepath, 0, NULL);
            if (hr == S_OK)
            {
                cout << "-------ok" << endl;
            }

    参考:

    http://www.cnblogs.com/codingmengmeng/p/6258020.html

    https://docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/platform-apis/ms775123(v=vs.85)#parameters

  • 相关阅读:
    python动态网页爬取——四六级成绩批量爬取
    python&MongoDB爬取图书馆借阅记录(没有验证码)
    【Linux】CentOS 7安装与使用,安装jdk1.8,安装mysql
    JavaWeb项目:旅游网站【涉及各种知识】
    【SpringMVC】使用三层架构实现登录,注册。(下篇)
    【SpringMVC】使用三层架构实现登录,注册。(上篇)
    【JSP】el、jstl、MVC、三层架构
    【Tomcat】JSP使用Session、Cookie实现购物车
    HttpServletRequest对象,请求行、请求头、请求体
    【Spring】JdbcTemplate的使用,查询,增、删、改
  • 原文地址:https://www.cnblogs.com/hellowooorld/p/9005068.html
Copyright © 2011-2022 走看看