C++ winhttp 实现文件下载器

这篇具有很好参考价值的文章主要介绍了C++ winhttp 实现文件下载器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本篇内容讲述 C++ winHttp 实现下载器的简单 demo,使用了 WinHttpOpen、WinHttpConnect、WinHttpOpenRequest、WinHttpSendRequest、WinHttpReceiveResponse、WinHttpQueryDataAvailable、WinHttpReadData、WinHttpCloseHandle 等函数。

版权声明:本文为CSDN博主「1_bit」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/A757291228/article/details/129974019

文章参考 Microsoft doc WinHttp:https://learn.microsoft.com/zh-cn/windows/win32/WinHttp/winhttp-start-page
本机环境:VisualStudio 2022 、 Windows10
想要完整代码请到文章末尾

一、WinHttp

WinHttp 是 Windows 提供的可创建网络请求的一组 API,包括 http、https、代理等;WinHttp 的 Microsoft doc 链接为 https://learn.microsoft.com/zh-cn/windows/win32/WinHttp/winhttp-start-page,若需要查看详细的文档说明,可进入 Microsoft doc 进行查看。

二、WinHttp 的使用

本篇文章只简单的介绍如何使用 WinHttp,并不涉及其原理,包括 http、https 协议不再讲解。关于不讲解的原因为思考后,发现即使不会协议,也能很好的使用 WinHttp,当然可能对于某些“复杂”的业务逻辑或特殊需求并不好处理,可能也会对于某些错误信息无法判断,若出现这种情况,建议读者再去了解 http、https 等协议,当然本人之后也会出相关的协议讲解的文章,但在本篇,我们只讨论如何使用 C++ WinHttp 进行网络请求。

在 Microsoft doc 中,有介绍 C++ WinHttp 的使用流程,可以根据这个 流程图 学习接下来的知识点:

C++ winhttp 实现文件下载器

2.1 WinHttp 的 http 一般使用流程

使用 C++ WinHttp 发送一个 Http 请求,需要经过以下流程 :WinHttpOpen->WinHttpConnect->WinHttpOpenRequest->WinHttpSendRequest->WinHttpReceiveResponse->WinHttpQueryDataAvailable->WinHttpReadData->WinHttpCloseHandle

以上所述内容只需要先有一个印象,接下来会对其进行详细说明。

对于以上流程用中文的进行解释为:WinHttpOpen (初始化 WinHttp )->WinHttpConnect (指定 Http 请求的初始目标服务器 )->WinHttpOpenRequest (创建 HTTP 请求句柄)->WinHttpSendRequest (指定请求发送到 Http 服务器) ->WinHttpReceiveResponse (等待 WinHttpSendRequest 发起的 HTTP 请求的响应) ->WinHttpQueryDataAvailable (读取数据大小) ->WinHttpReadData**(读取数据)** ->WinHttpCloseHandle (关闭连接)

2.2 VisualStduio 环境准备

本机环境使用的 VS 版本为2022,打开后点击创建项目:

C++ winhttp 实现文件下载器
选择控制台程序:

C++ winhttp 实现文件下载器
接下来编写完项目名称点击下一步即可:
C++ winhttp 实现文件下载器
接下来在 右侧解决方案资源管理器 下的 SourceFiles 中找到 main.cpp 进行代码编写即可:

C++ winhttp 实现文件下载器

2.3 WinHttpOpen 初始化 WinHttp

在了解了 WinHttp 的一般步骤后,首先开始读 WinHttp 的初始化操作。一个 WinHttp 的函数圆形如下:

WINHTTPAPI HINTERNET WinHttpOpen(
  [in, optional] LPCWSTR pszAgentW,
  [in]           DWORD   dwAccessType,
  [in]           LPCWSTR pszProxyW,
  [in]           LPCWSTR pszProxyBypassW,
  [in]           DWORD   dwFlags
);

WinHttpOpen 接收 5 个参数,分别是 pszAgentWdwAccessTypepszProxyWpszProxyBypassWdwFlags,其中:

  • pszAgentW:表示代理名称 agent name
  • dwAccessType:表示如何http(假定)如何进行请求 可选
  • pszProxyW:表示若使用代理则在此处填写对应的代理服务器和端口号 可选
  • pszProxyBypassW:表示绕过的代理服务器主机名
  • dwFlags:表示使用某些特定的组合选项

在以上的解释中,对于网络知识薄弱的同学可能会感到一头雾水,在此使用一个示例进行说明:

hSession = WinHttpOpen(
L"My User Agent Name",
WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
WINHTTP_NO_PROXY_NAME,
WINHTTP_NO_PROXY_BYPASS,
0);

以上是一个 WinHttpOpen 的代码示例,其中参数:

  • pszAgentW 设置为了 "My User Agent Name",这就是我们的代理名称为 "My User Agent Name",或者你想用其他名称也行。
  • dwAccessType 设置为了 WINHTTP_ACCESS_TYPE_DEFAULT_PROXY 表示使用默认代理设置,也就是说当前本机的默认网络代理设置是什么就是什么,或者说咱们没有什么特殊的代理需求时,设置为 WINHTTP_ACCESS_TYPE_DEFAULT_PROXY 即可。
  • pszProxyW 设置为了 WINHTTP_NO_PROXY_NAME 表示当前的请求不使用代理。毕竟在上一个设置时咱们设置了使用默认代理,那么理应设置成不适用代理(当然,你可能当前本机是有代理,默认了,那么也是走那个默认的代理去请求的)。
  • pszProxyBypassW 设置为了 WINHTTP_NO_PROXY_BYPASS 则表示不绕过任何的主机,则使用当前的默认代理进行访问。
  • dwFlags 设置为 0 表示打开会话时不使用特定的选项,该怎样就怎样。

以上设置中 dwAccessType 还可以设置成 WINHTTP_ACCESS_TYPE_NO_PROXYWINHTTP_ACCESS_TYPE_NAMED_PROXY,其中:

  • WINHTTP_ACCESS_TYPE_NO_PROXY 表示直接链接到目标服务器不使用代理
  • WINHTTP_ACCESS_TYPE_NAMED_PROXY 表示使用目标代理

接下来在 VS 2022 中添加 WinHttp 头文件对其引入:

#include <Winhttp.h>

并且需要添加对应的编译指示器,指定库文件链接:

#pragma comment(lib, "winhttp.lib")

为了方便接下来的操作,咱们顺势将其他头文件引入:

#include <Windows.h>
#include <iostream>

接着创建一个 HINTERNET 句柄对象用于接收 WinHttp 初始化后的句柄:

HINTERNET hSession = NULL;

此时还可以在之后进行判断,是否初始化成功:

if (!hSession) {
    std::cerr << "WinHttp 打开错误 \n";
    return 1;
}

接着就可以复制以上示例代码到 main.cpp 文件中了,此时的 main.cpp 文件代码如下:

#include "pch.h"
#include <Windows.h>
#include <iostream>
#include <Winhttp.h>
#pragma comment(lib, "winhttp.lib")

using namespace winrt;
using namespace Windows::Foundation;

int main()
{
    HINTERNET hSession = NULL;
    hSession = WinHttpOpen(
        L"My User Agent",
        WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
        WINHTTP_NO_PROXY_NAME,
        WINHTTP_NO_PROXY_BYPASS,
        0);
    if (!hSession) {
        std::cerr << "WinHttp 打开错误 \n";
        return 1;
    }
}

2.3 WinHttpConnect 指定 Http 请求的初始目标服务器

完成了 WinHttp 初始化后,使用 WinHttpConnect 指定 Http 的目标服务器,WinHttpConnect 函数原型如下:

WINHTTPAPI HINTERNET WinHttpConnect(
  [in] HINTERNET     hSession,
  [in] LPCWSTR       pswzServerName,
  [in] INTERNET_PORT nServerPort,
  [in] DWORD         dwReserved
);

WinHttpConnect 接收 4 个参数:

  • hSession:为 WinHttp 初始化后的句柄
  • pswzServerName:为目标服务器名,域名或IP
  • nServerPort: 为指定的端口,如果是 HTTP 就是80,若是 HTTPS 就是 443
  • dwReserved:保留参数,设置为 0 即可,不用管,文档也是这样写的

以上参数中 nServerPort 可以设置为:

  • INTERNET_DEFAULT_HTTP_PORT:使用 HTTP 服务器的默认端口 (端口 80)
  • INTERNET_DEFAULT_HTTPS_PORT:使用 HTTPS 服务器的默认端口 (端口 443) 。

此时该函数可编写为:

HINTERNET hConnect = NULL;
hConnect = WinHttpConnect(
	hSession,
	L"demo.com",//此处填写你要进行 http 请求的 hostname 或 ip
	80,
	0
);

2.4 WinHttpOpenRequest 创建 HTTP 请求句柄

WinHttpOpenRequest 创建 HTTP 请求句柄,函数原型如下:

WINHTTPAPI HINTERNET WinHttpOpenRequest(
  [in] HINTERNET hConnect,
  [in] LPCWSTR   pwszVerb,
  [in] LPCWSTR   pwszObjectName,
  [in] LPCWSTR   pwszVersion,
  [in] LPCWSTR   pwszReferrer,
  [in] LPCWSTR   *ppwszAcceptTypes,
  [in] DWORD     dwFlags
);
  • hConnectWinHttpConnect 返回的 HINTERNET 句柄。
  • pwszVerb 请求类型参数,例如 GET,需要大写
  • pwszObjectName url 请求参数
  • pwszVersion 指定 HTTP 版本,默认为 NULL,使用 HTTP/1.1
  • pwszReferrer 表示请求的来源地址,如果没有其他页面跳转到目标请求,那么设置为 NULL,也可以使用 WINHTTP_NO_REFERER 代替
  • ppwszAcceptTypes 表示 HTTP 请求可接受的 MIME 类型,例如 “application/json”“text/html”,设置为 WINHTTP_DEFAULT_ACCEPT_TYPES 表示使用 WinHTTP 默认的 MIME 类型设置
  • dwFlags 若不需要设置任何特殊标志和选项那么设置为 0 即可

dwFlags 参数还可以设置为 WINHTTP_FLAG_SECUREWINHTTP_FLAG_ESCAPE_PERCENTWINHTTP_FLAG_NULL_CODEPAGEWINHTTP_FLAG_BYPASS_PROXY_CACHE

  • WINHTTP_FLAG_SECURE 表示使用 HTTPS 链接,默认情况下 winHttp 使用 HTTP
  • WINHTTP_FLAG_ESCAPE_PERCENT 表示在请求之前对 URL 中的 % 进行转义
  • WINHTTP_FLAG_NULL_CODEPAGE 表示无需为响应的 Unicode 字符串指定代码页
  • WINHTTP_FLAG_BYPASS_PROXY_CACHE 表示绕过服务器缓存直接请求服务器内容

那么以上函数可写成:

HINTERNET hRequest = NULL;
hRequest = WinHttpOpenRequest(
    hConnect, L"GET",
    L"disk.exe",
    NULL,
    WINHTTP_NO_REFERER,
    WINHTTP_DEFAULT_ACCEPT_TYPES,
    0);
if (!hRequest) {
    std::cerr << "WinHttpOpenRequest 错误 \n";
    WinHttpCloseHandle(hConnect);
    WinHttpCloseHandle(hSession);
    return 1;
}

2.5 WinHttpSendRequest 指定请求发送到 Http 服务器

函数原型如下:

WINHTTPAPI BOOL WinHttpSendRequest(
  [in]           HINTERNET hRequest,
  [in, optional] LPCWSTR   lpszHeaders,
  [in]           DWORD     dwHeadersLength,
  [in, optional] LPVOID    lpOptional,
  [in]           DWORD     dwOptionalLength,
  [in]           DWORD     dwTotalLength,
  [in]           DWORD_PTR dwContext
);

参数说明:

  • hRequestRequest WinHTTP 请求句柄
  • pwszHeaders:如果没有要添加的标头,则为 NULL 或者为 WINHTTP_NO_ADDITIONAL_HEADERS
  • dwHeadersLengthpwszHeaders 参数以字节为单位的长度,若 pwszHeadersNULL,则此参数为 0
  • lpOptional:要发送到服务器的数据,如果没有要发送的数据,则为 NULLWINHTTP_NO_REQUEST_DATA
  • dwOptionalLengthlpOptional 以字节为单位的长度,lpOptionalNULL,则此参数为 0
  • dwTotalLength:请求的总长度,没有标头也没有数据,则为 0
  • dwContext:用于指定调用方自定义的上下文值,在请求完成后可以通过回调函数获取该值,不需要设置回调则为 0

此时代码可以编写为如下:

bResults = WinHttpSendRequest(hRequest,
    WINHTTP_NO_ADDITIONAL_HEADERS, 0,
    WINHTTP_NO_REQUEST_DATA, 0,
    0, 0);
if (!bResults) {
    std::cerr << "WinHttpSendRequest 错误 \n";
    WinHttpCloseHandle(hRequest);
    WinHttpCloseHandle(hConnect);
    WinHttpCloseHandle(hSession);
    return 1;
}

2.6 WinHttpReceiveResponse 等待 WinHttpSendRequest 发起的 HTTP 请求的响应

函数原型如下:

WINHTTPAPI BOOL WinHttpReceiveResponse(
  [in] HINTERNET hRequest,
  [in] LPVOID    lpReserved
);
  • hRequest :已通过 WinHttpSendRequest 函数发送请求并返回的 WinHTTP 请求句柄。
    等待 WinHttpSendRequest 完成此句柄,然后再调用 WinHttpReceiveResponse
  • lpReserved:保留参数设置为 NULL

此时代码如下:

bResults = WinHttpReceiveResponse(hRequest, NULL);
if (!bResults) {
    std::cerr << "WinHttpReceiveResponse 错误 \n";
    WinHttpCloseHandle(hRequest);
    WinHttpCloseHandle(hConnect);
    WinHttpCloseHandle(hSession);
    return 1;
}

2.7 WinHttpQueryDataAvailable 读取数据大小

接下来使用 WinHttpQueryDataAvailable 读取数据大小,方便接下来读取数据到某一个 buf 之中。

WinHttpQueryDataAvailable 函数原型如下:

WINHTTPAPI BOOL WinHttpQueryDataAvailable(
  [in]  HINTERNET hRequest,
  [out] LPDWORD   lpdwNumberOfBytesAvailable
);

hRequestWinHttpSendRequestWinHTTP 句柄
lpdwNumberOfBytesAvailable:尚未读取的响应数据的大小

此时代码如下:

DWORD dwSize = 0;
LPSTR pszOutBuffer = NULL;
dwSize = 0;
WinHttpQueryDataAvailable(hRequest, &dwSize);
pszOutBuffer = new char[dwSize + 1];
ZeroMemory(pszOutBuffer, dwSize + 1);//清空 pszOutBuffer 

2.8 WinHttpReadData 读取数据

WinHttpReadData 函数将会读取还没有读取的数据,函数原型如下:

WINHTTPAPI BOOL WinHttpReadData(
  [in]  HINTERNET hRequest,
  [out] LPVOID    lpBuffer,
  [in]  DWORD     dwNumberOfBytesToRead,
  [out] LPDWORD   lpdwNumberOfBytesRead
);
  • hRequestWinHttpSendRequestWinHTTP 句柄
  • lpBufferbuf 指针 存储读取数据
  • dwNumberOfBytesToRead:读取数据的字节数大小
  • lpdwNumberOfBytesRead:此时实际读取数据的字节数

由于此时 WinHttpReadData 返回的是 BOOL,那么直接 while 进行读取即可,当然,也可以 lpdwNumberOfBytesRead 为 0 时 break

while (WinHttpReadData(hRequest, (LPVOID)pszOutBuffer, dwSize, &dwDownloaded)) {
   if (dwDownloaded == 0)
       break;
}

此时读取的是 exe 二进制流数据,咱们可以直接 cout 输出,代码如下:

std::cout << pszOutBuffer;
delete[] pszOutBuffer;
WinHttpCloseHandle(hRequest);
WinHttpCloseHandle(hConnect);
WinHttpCloseHandle(hSession);

结果如下:

C++ winhttp 实现文件下载器

下载器输出完整代码

该部分完整代码如下:

#include "pch.h"
#include <Windows.h>
#include <iostream>
#include <Winhttp.h>
#pragma comment(lib, "winhttp.lib")

using namespace winrt;
using namespace Windows::Foundation;

int main()
{
    HINTERNET hSession = NULL;
    HINTERNET hConnect = NULL;
    HINTERNET hRequest = NULL;

    DWORD dwSize = 0;
    LPSTR pszOutBuffer = NULL;
    DWORD dwDownloaded = 0;
    bool bResults = false;

    hSession = WinHttpOpen(
        L"My User Agent",
        WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
        WINHTTP_NO_PROXY_NAME,
        WINHTTP_NO_PROXY_BYPASS,
        0);
    if (!hSession) {
        std::cerr << "WinHttp 打开错误 \n";
        return 1;
    }

    hConnect = WinHttpConnect(
        hSession,
        L"hostname or ip",
        80,
        0);

    if (!hConnect) {
        std::cerr << "WinHttpConnect 错误 \n";
        WinHttpCloseHandle(hSession);
        return 1;
    }

    hRequest = WinHttpOpenRequest(
        hConnect, L"GET",
        L"disk.exe",
        NULL,
        WINHTTP_NO_REFERER,
        WINHTTP_DEFAULT_ACCEPT_TYPES,
        0);
    if (!hRequest) {
        std::cerr << "WinHttpOpenRequest 错误 \n";
        WinHttpCloseHandle(hConnect);
        WinHttpCloseHandle(hSession);
        return 1;
    }

    bResults = WinHttpSendRequest(hRequest,
        WINHTTP_NO_ADDITIONAL_HEADERS, 0,
        WINHTTP_NO_REQUEST_DATA, 0,
        0, 0);
    if (!bResults) {
        std::cerr << "WinHttpSendRequest 错误 \n";
        WinHttpCloseHandle(hRequest);
        WinHttpCloseHandle(hConnect);
        WinHttpCloseHandle(hSession);
        return 1;
    }

    bResults = WinHttpReceiveResponse(hRequest, NULL);
    if (!bResults) {
        std::cerr << "WinHttpReceiveResponse 错误 \n";
        WinHttpCloseHandle(hRequest);
        WinHttpCloseHandle(hConnect);
        WinHttpCloseHandle(hSession);
        return 1;
    }

    dwSize = 0;
    WinHttpQueryDataAvailable(hRequest, &dwSize);
    pszOutBuffer = new char[dwSize + 1];
    ZeroMemory(pszOutBuffer, dwSize + 1);

    while (WinHttpReadData(hRequest, (LPVOID)pszOutBuffer, dwSize, &dwDownloaded)) {
        if (dwDownloaded == 0)
            break;
    }

    std::cout << pszOutBuffer;
    delete[] pszOutBuffer;
    WinHttpCloseHandle(hRequest);
    WinHttpCloseHandle(hConnect);
    WinHttpCloseHandle(hSession);

}

三、代码更改成下载程序并保存

想要更改以上示例下载文件保存到磁盘步骤简单,首先引入 fstream 头文件:

#include <fstream>

接在在下图所示处开始添加代码:

C++ winhttp 实现文件下载器
此时添加的代码如下:

std::ofstream outfile("C:\\demo.exe", std::ios::binary);

此时表示输出内容到 C:\\demo.exe 下保存,当然 demo.exe 是你的文件名。

接着创建一个 BYTE 对象为缓冲区:

BYTE buffer[1024];

修改原有的 while 循环读取如下:

while (WinHttpReadData(hRequest, buffer, sizeof(buffer), &dwDownloaded)) {
    outfile.write(reinterpret_cast<const char*>(buffer), dwDownloaded);
    if (dwDownloaded == 0)
        break;
}
outfile.close();

此时读取到的缓冲区变成了 buffer,并且在读取后,在 使用 outfile.write 写入数据(不会的可以查一下文档,这个很简单)。

最后关闭 文件操作 即可。

运行程序完毕后,已下载内容到磁盘中:

C++ winhttp 实现文件下载器

下载器完整代码

此时修改过的完整下载器代码如下:文章来源地址https://www.toymoban.com/news/detail-428391.html

#include "pch.h"
#include <Windows.h>
#include <iostream>
#include <Winhttp.h>
#include <fstream>
#pragma comment(lib, "winhttp.lib")

using namespace winrt;
using namespace Windows::Foundation;

int main()
{
    HINTERNET hSession = NULL;
    HINTERNET hConnect = NULL;
    HINTERNET hRequest = NULL;

    DWORD dwSize = 0;
    LPSTR pszOutBuffer = NULL;
    DWORD dwDownloaded = 0;
    bool bResults = false;

    hSession = WinHttpOpen(
        L"My User Agent",
        WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
        WINHTTP_NO_PROXY_NAME,
        WINHTTP_NO_PROXY_BYPASS,
        0);
    if (!hSession) {
        std::cerr << "WinHttp 打开错误 \n";
        return 1;
    }

    hConnect = WinHttpConnect(
        hSession,
        L"hostname",
        80,
        0);

    if (!hConnect) {
        std::cerr << "WinHttpConnect 错误 \n";
        WinHttpCloseHandle(hSession);
        return 1;
    }

    hRequest = WinHttpOpenRequest(
        hConnect, L"GET",
        L"disk.exe",
        NULL,
        WINHTTP_NO_REFERER,
        WINHTTP_DEFAULT_ACCEPT_TYPES,
        0);
    if (!hRequest) {
        std::cerr << "WinHttpOpenRequest 错误 \n";
        WinHttpCloseHandle(hConnect);
        WinHttpCloseHandle(hSession);
        return 1;
    }

    bResults = WinHttpSendRequest(hRequest,
        WINHTTP_NO_ADDITIONAL_HEADERS, 0,
        WINHTTP_NO_REQUEST_DATA, 0,
        0, 0);
    if (!bResults) {
        std::cerr << "WinHttpSendRequest 错误 \n";
        WinHttpCloseHandle(hRequest);
        WinHttpCloseHandle(hConnect);
        WinHttpCloseHandle(hSession);
        return 1;
    }

    bResults = WinHttpReceiveResponse(hRequest, NULL);
    if (!bResults) {
        std::cerr << "WinHttpReceiveResponse 错误 \n";
        WinHttpCloseHandle(hRequest);
        WinHttpCloseHandle(hConnect);
        WinHttpCloseHandle(hSession);
        return 1;
    }

    //dwSize = 0;
    //WinHttpQueryDataAvailable(hRequest, &dwSize);
    //pszOutBuffer = new char[dwSize + 1];
    //ZeroMemory(pszOutBuffer, dwSize + 1);

    std::ofstream outfile("C:\\demo.exe", std::ios::binary);
    BYTE buffer[1024];
    while (WinHttpReadData(hRequest, buffer, sizeof(buffer), &dwDownloaded)) {
        outfile.write(reinterpret_cast<const char*>(buffer), dwDownloaded);
        if (dwDownloaded == 0)
            break;
    }
    outfile.close();

    /*
    while (WinHttpReadData(hRequest, (LPVOID)pszOutBuffer, dwSize, &dwDownloaded)) {
        if (dwDownloaded == 0)
            break;
    }
    */
    //std::cout << pszOutBuffer;
    //delete[] pszOutBuffer;
    WinHttpCloseHandle(hRequest);
    WinHttpCloseHandle(hConnect);
    WinHttpCloseHandle(hSession);

}

到了这里,关于C++ winhttp 实现文件下载器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 大数据:HDFS的Shell操作,进程启动管理,文件系统操作命令,创建文件文件夹,下载上传,复制移动,删除,展示,追加内容

    2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多算法学生都得去找开发,测开 测开的话,你就得学数据库,sql,oracle,尤其sql要学,当然,像很多金融企业、安全机构啥的,他们必须要用oracle数据库 这oracle比sql安全,强大多了,所以你需要学

    2024年02月07日
    浏览(71)
  • 微信小程序下载zip压缩包后解压,并且打开文件查看的内容

            在开发pc端后台管理系统的时候,经常会遇到这样的需求:下载zip到本地,然后用户双击压缩包,并借助电脑端的压缩软件打开压缩包,就可以查看里面的word、excel、pdf文件里面的内容。(这种需求,毫无疑问,对于我们前端开发工程师来说,已经是习以为常了)。

    2024年02月08日
    浏览(54)
  • c++ WinInet InternetOpenUrl下载中文文件

    windows自带的WinInet,几个函数就可以实现http文件下载, 且可获取文件大小,进度条等。 在用WinInet下载文件时,遇到个问题, 如果是中文,下载下来的文件大小为0 英文文件正常,为什么呢?

    2024年02月12日
    浏览(37)
  • 【Java 实现文件下载】vue前端+java后端实现文件下载详解(附源码)

    【 写在前面 】前端时间总结了一下有关java文件上传的功能,也给不少读者带来一些帮助,因此今天继续完善文件下载这套体系,希望能给屏幕前的您带来实质性的帮助,其实文件下载最怕的就是中文乱码的现象,当然这个我单独写了一篇文章解释,这里不做详谈。 涉及知识

    2024年02月09日
    浏览(56)
  • 前端实现文件下载功能——文件流

    前端下载文件一般使用的是blob 核心的步骤是获取后端响应的文件流,用blob创建一个临时的URL,然后创建一个隐藏的a标签,实现下载需求。 那就先上代码 如果后端响应的数据是一个二进制数据,那我们就得这是响应类型是blob,否则浏览器会默认按照json解析 至于后端如何向

    2024年02月11日
    浏览(52)
  • 【Java实战】Feign调用文件下载服务接口实现文件下载功能

    最近需要实现Feign调用服务提供者的文件下载接口,进行文件下载功能,这里对功能的实现做一个简单的记录 通过调用服务提供者的文件下载接口,将文件传输的流数据通过 feign.Response 来接收,服务消费者再将数据转化 首先,在项目中引入Feign的依赖。你可以使用Maven进行管

    2024年02月12日
    浏览(80)
  • 通过 Blob 对二进制流文件下载实现文件保存下载

    原理 : 前端将二进制文件做转换 实现下载:请求后端接口-接收后端返回的二进制流(通过二进制流( Blob )下载, 把后端返回的二进制文件放在 Blob 里面)-再通过 file-saver 插件保存 需求背景 业务:下载模板文件 页面上使用: 保存文件: 发起请求通用方法(更改 axios 的 re

    2024年02月09日
    浏览(72)
  • axios下载csv文件下载-功能实现

    须将axios 配置中的 responseType 设置为 arraybuffer  

    2024年02月05日
    浏览(55)
  • js 实现多个文件循环下载 批量下载

    最近业务涉及勾选之后多个word文件下载 开始用的循环方式 怎么试都是下载最后一个文件 后来找到原因是 当循环执行下载的时候,几个下载命令连续执行的时候,浏览器会取消上一个下载,直接下载最后一个文件 。所以要加一个定时器,让几个连续的下载请求之间有时间间

    2024年02月11日
    浏览(49)
  • 前端实现下载文件(包含压缩包下载)方式汇总

    默认最简单的下载方式是: window.open(后台接口API路径) ,但该方法弊端:因是新开窗口方式,前端展示上,每次会闪下。 此外,如果使用window.open(文件URL)方式: pdf、office文档、psd:直接下载。 图片、txt:新开窗口预览,不会下载;且txt预览,有时出现中文乱码问题。 一、

    2024年02月10日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包