获取HTTP 头中响应请求文件的大小

RHTTPHeaders headers = resp.GetHeaderCollection ( );
THTTPHdrVal aHeaderValue;

TRAPD(error,GetHeaderL (headers, _L8("Content-Length"), aHeaderValue ))

void GetHeaderL(RHTTPHeaders aHeaders,
const TDesC8 &aHeaderField, THTTPHdrVal &aHeaderValue )
{
RStringPool string_pool = iSession.StringPool ( );
RStringF contLength = string_pool.OpenFStringL (aHeaderField );

aHeaders.GetField (contLength, 0, aHeaderValue );

contLength.Close ( );
}
//可用获取到请求文件的大小,比如下载文件时可用拿到文件的大小.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue3 本身并不提供文件分块下载的功能,这需要在前端和后端各自实现。一般来说,前端需要使用 Range 请求获取不同的文件块,后端需要将这些文件块合并成一个完整的文件。 前端实现文件分块下载的关键是使用 Range 请求头来获取不同的文件块。具来说,可以使用 `XMLHttpRequest` 对象来发送带有 Range 请求头的请求。以下是一个示例代码: ```javascript function download(url, chunkSize = 1024 * 1024) { return new Promise((resolve, reject) => { const xhr = new XMLHttpRequest(); xhr.open('HEAD', url); xhr.onload = () => { if (xhr.status === 200) { const fileSize = parseInt(xhr.getResponseHeader('Content-Length')); const chunks = Math.ceil(fileSize / chunkSize); const promises = []; for (let i = 0; i < chunks; i++) { const start = i * chunkSize; const end = Math.min((i + 1) * chunkSize - 1, fileSize - 1); const promise = new Promise((resolve, reject) => { const xhr = new XMLHttpRequest(); xhr.open('GET', url); xhr.setRequestHeader('Range', `bytes=${start}-${end}`); xhr.responseType = 'arraybuffer'; xhr.onload = () => { if (xhr.status === 206) { resolve(xhr.response); } else { reject(new Error(`Request range ${start}-${end} failed with status ${xhr.status}`)); } }; xhr.onerror = () => { reject(new Error(`Request range ${start}-${end} failed`)); }; xhr.send(); }); promises.push(promise); } Promise.all(promises).then((results) => { const file = new Blob(results, { type: xhr.getResponseHeader('Content-Type') }); resolve(file); }).catch((error) => { reject(error); }); } else { reject(new Error(`Request head failed with status ${xhr.status}`)); } }; xhr.onerror = () => { reject(new Error('Request head failed')); }; xhr.send(); }); } ``` 这段代码做了以下几件事情: 1. 发送一个 HEAD 请求获取文件大小和类型。 2. 根据文件大小和每个文件块的大小计算出需要下载的文件块数量。 3. 发送多个带有 Range 请求头的 GET 请求分别获取不同的文件块。 4. 将所有文件块合并成一个 Blob 对象。 后端合并文件块的关键是将多个文件块按顺序写入到同一个文件。以下是一个示例代码: ```javascript const http = require('http'); const fs = require('fs'); const filePath = 'path/to/file'; const port = 3000; http.createServer((req, res) => { const rangeHeader = req.headers.range; if (rangeHeader) { const fileStat = fs.statSync(filePath); const fileSize = fileStat.size; const ranges = rangeHeader.substr(6).split(',').map((range) => { const [start, end] = range.split('-'); return { start: parseInt(start), end: end ? parseInt(end) : fileSize - 1 }; }); if (ranges.length === 1) { const range = ranges[0]; res.writeHead(206, { 'Content-Range': `bytes ${range.start}-${range.end}/${fileSize}`, 'Content-Length': range.end - range.start + 1, 'Content-Type': 'application/octet-stream' }); fs.createReadStream(filePath, { start: range.start, end: range.end }).pipe(res); } else { res.writeHead(206, { 'Content-Type': 'multipart/byteranges; boundary=3d6b6a416f9b5' }); let responseEnded = false; ranges.forEach((range, index) => { const stream = fs.createReadStream(filePath, { start: range.start, end: range.end }); stream.on('error', (error) => { if (!responseEnded) { responseEnded = true; res.end(); } }); stream.on('end', () => { if (index === ranges.length - 1 && !responseEnded) { responseEnded = true; res.end('\r\n--3d6b6a416f9b5--\r\n'); } }); res.write(`--3d6b6a416f9b5\r\nContent-Type: application/octet-stream\r\nContent-Range: bytes ${range.start}-${range.end}/${fileSize}\r\n\r\n`); stream.pipe(res, { end: false }); }); } } else { const fileStat = fs.statSync(filePath); const fileSize = fileStat.size; res.writeHead(200, { 'Content-Length': fileSize, 'Content-Type': 'application/octet-stream' }); fs.createReadStream(filePath).pipe(res); } }).listen(port, () => { console.log(`Server is listening on port ${port}`); }); ``` 这段代码做了以下几件事情: 1. 解析 Range 请求头,如果请求头无效或未指定 Range,则返回整个文件。 2. 如果请求头只有一个 Range,则返回对应的文件块。 3. 如果请求头有多个 Range,则返回多个文件块,并使用 `multipart/byteranges` 类型的响应头进行分隔。 4. 将所有文件块按顺序写入到同一个响应。 当前端获取到所有文件块后,就可以将它们合并成一个完整的文件。可以使用 `Blob` 对象和 `URL.createObjectURL` 方法来实现这个功能。以下是一个示例代码: ```javascript const file = await download('path/to/file'); const url = URL.createObjectURL(file); const a = document.createElement('a'); a.href = url; a.download = 'file'; a.click(); URL.revokeObjectURL(url); ``` 这段代码做了以下几件事情: 1. 调用 `download` 函数来获取所有文件块并合并成一个 Blob 对象。 2. 使用 `URL.createObjectURL` 方法将 Blob 对象转换成一个 URL。 3. 创建一个 `<a>` 元素并设置其 `href` 和 `download` 属性,然后模拟点击该元素来触发文件下载。 4. 使用 `URL.revokeObjectURL` 方法释放 URL 所占用的内存。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值