reactjs - 提高axios获取下载速度
问题描述
我正在使用axios
从 Azure 存储 Blob 下载文件 (~100MB)。
axios({
method: 'get',
url: uri,
onDownloadProgress: (progressEvent) => {
console.log("Loaded: " + ((progressEvent.loaded / progressEvent.total) * 100) + "%");
},
responseType: 'arraybuffer'
}).then({})
我的问题是实际下载文件需要相当长的时间(约 10 分钟)。我以前使用的 fetch() 甚至比这慢(约 15-20 分钟)。对于如何加快下载速度,你们有什么建议吗?我的网速不是问题,因为直接下载文件或使用 Azure 存储资源管理器(1.12.0、AzCopy 10.3.3)只需不到 2 分钟。
我也尝试使用 azure-storage 的 blobServiceClient,但速度与 axios 和 fetch 相似(大约 15kbps)。
如果有帮助,这在 React 应用程序中。
解决方案
我测试了下载速度。我希望我的结果对你有用。
- 我
StorageExplorer.exe
作为源文件上传以进行下载测试。文件大小为 92.5M。
- 通过下载文件
Azure Storage Explore
,它会占用1 minute and 07 seconds
。
- 通过 chrome 浏览器在门户中下载文件,它将花费
58 seconds
.
- 通过我的测试代码下载文件。
portal
① 从或复制 URL Storage Explore
。
像这样的url:<code>https://p*****ge.blob.core.windows.net/testcontainer/StorageExplorer.exe
用我的代码测试过,会1 minute and 52 seconds
很费时间,而且很不稳定,有时候测试下载时间会比较长。
② 从 复制网址AzCopy Command
。
url格式如下:https://pan********ge.blob.core.windows.net/testcontainer/StorageExplorer.exe?se=2020-09-18T07%3A55%3A28Z&sp=rl&sv=2018-03-28&sr=c&sig=5kJyTBwHHRS******mlj3%2FWj9CmvQriXCMi4%3D
通过相同的代码测试后,它将花费1 minute and 02 seconds
.
我的测试结论:
不要使用看起来像https://p*****ge.blob.core.windows.net/testcontainer/StorageExplorer.exe
.
您可以使用看起来像从 AzCopy 命令获取的 url。
下面是我的测试代码。
- npm 我进步了
- npm i axios
'use strict'
const Fs = require('fs')
const Path = require('path')
const Axios = require('axios')
const ProgressBar = require('progress')
async function download () {
const url = 'https://pan*****e.blob.core.windows.net/testcontainer/StorageExplorer.exe'
console.log('Connecting …')
const { data, headers } = await Axios({
url,
method: 'GET',
responseType: 'stream'
})
const totalLength = headers['content-length']
console.log('Starting download')
const progressBar = new ProgressBar('-> downloading [:bar] :percent :etas', {
width: 40,
complete: '=',
incomplete: ' ',
renderThrottle: 1,
total: parseInt(totalLength)
})
const writer = Fs.createWriteStream(
Path.resolve(__dirname, 'software', 'StorageExplorer.exe')
)
data.on('data', (chunk) => progressBar.tick(chunk.length))
data.pipe(writer)
}
download()
推荐阅读
- node.js - gcloud app deploy build 失败,错误模块未找到'link-module-alias'
- ssl - 在使用 openresty 实现 ssl 时,AWS EC2 实例出现 sni-support-required-for-valid-ssl 错误
- python - while 循环会执行多少次?
- f# - 如何更改类中的 x,y 坐标
- javascript - 关于错误的简单问题无法读取javascript中的属性
- scala - 直方图 - 以并行方式进行
- linux - Gnuplot 垂直虚线
- php - 选择带撇号的框数据未在数据库中提交
- python - 如何从输出中删除最后一个逗号?
- reactjs - 页面加载时如何在 Redux 中存储数据?