gpt4 book ai didi

typescript - 使用 HTTP Content-Type header 确定二进制数据与文本

转载 作者:行者123 更新时间:2023-12-05 07:22:04 24 4
gpt4 key购买 nike

我正在编写代码以在 Node.js 环境中通过 HTTP/HTTPS 读取任意 Web 资源,并且我想在文本数据时将内容作为字符串返回,在二进制数据时作为 Buffer 返回。

很明显,以 text 开头的任何内容(如 text/html)都是文本数据,最好以字符串形式返回 — 当然,使用适当的字符编码,这可以明确定义(例如 text/html; charset=utf-8),也可以不明确定义。此外,无论 MIME 类型如何,charset 的任何明确定义都表明内容是文本,而不是二进制。

据我所知,几乎其他一切都是二进制数据。我所知道的所有音频和视频格式都是二进制的,几乎所有图像类型都是二进制的,image/svg+xml 除外。似乎大多数 application/... 类型都是二进制的,但也有一些值得注意的常见异常(exception),例如 application/json

以下功能是否足以确定问题?如果不是,我可能会遗漏哪些值得注意的异常(exception)?

function isBinary(contentType: string): boolean {
let $: string[];

if (/;\s*charset\s*=/i.test(contentType))
return false;

// Remove anything other than MIME type.
contentType = contentType.replace(/;.*$/, '').trim();

if (/^text\//i.test(contentType) || /\+xml$/i.test(contentType))
return false;
else if (($ = /^application\/(.+)/i.exec(contentType)))
return !/^(javascript|ecmascript|json|ld\+json|rtf)$/i.test($[1]);
else
return true;
}

最佳答案

好吧,您可以在从 URL 获取的缓冲区上使用 istextorbinary。

例如在 lambda 中你会:

const fetch = require('node-fetch');
const { isText, isBinary, getEncoding } = require('istextorbinary');
module.exports.handler = async (event, context, callback) => {
.
.
const customUrl = 'www.abc.net.au';
const url = `https://${customUrl}${event.path}`;

// Request with GET/HEAD method cannot have body | undefined
// Set fetch parameters in params
var params = {};
if (event.httpMethod === 'GET' || event.httpMethod === 'HEAD') {
params = {
method: event.httpMethod,
headers: customRequestHeader
};
} else {
params = {
method: event.httpMethod,
headers: customRequestHeader,
body: JSON.stringify(parsedbody)
};
}

console.debug('request params: ' + JSON.stringify(params));

// Fetch URL with params
const response = await fetch(url, params);
var textResponse = await response.buffer();

var isBase64EncodedValue = false;
if ( isBinary(null, textResponse) ) {
console.log('textResponse is a binary blob - setting isBase64Encoded to true on returnResponse');
isBase64EncodedValue = true;
console.log('isBase64EncodedValue in returnResponse is: ' + isBase64EncodedValue);
// We need to return binary base64 encoded data for binary files - otherwise APIGW will throw 500 error back to the user
textResponse = textResponse.toString('base64');
// If you need to convert it back you could do something like - textResponse.toString('binary')
console.log('When isBase64EncodedValue is true, textResponse is: ' + textResponse);
} else {
console.log('textResponse is not a binary blob - setting isBase64Encoded to false on returnResponse');
isBase64EncodedValue = false;
console.log('isBase64EncodedValue in returnResponse is: ' + isBase64EncodedValue);
textResponse = textResponse.toString('utf8');
console.log('When isBase64EncodedValue is false, textResponse is: ' + textResponse);
}

.
.
};

您最终使用了您的函数了吗?想分享您的最终代码吗?

关于typescript - 使用 HTTP Content-Type header 确定二进制数据与文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56641562/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com