如何在NodeJs中将文件放入Tika服务器



场景

我正在运行一个VueJs客户端、一个NodeJs Restify API服务器和一个官方Docker镜像的Tika-Server。用户使用包含要解析的PDF文件的formData进行POST调用。API服务器接收POST调用,我将PDF保存在服务器上。API服务器应将文件放入Tika-server上的unpack/all端点,并接收包含文本文件、元数据文件和PDF中的图像集的zip。然后我会处理zip并将一些数据传递回客户端。

问题

我创建了一个缓冲区,其中包含要使用let parsingData = fs.createReadStream(requestFilename);let parsingData = fs.readFileSync(requestFilename);解析的文件,将axios数据字段设置为parsingData,然后提出请求。当我从Tika服务器得到响应时,Tika服务器似乎将请求视为空;在zip中,没有图像,TEXT文件为空,METADATA

当我通过CURLcurl -T pdf_w_images_and_text.pdf http://localhost:9998/unpack/all -H "X-Tika-PDFExtractInlineImages: true" -H "X-Tika-PDFExtractUniqueInlineImagesOnly: true"> tika-response.zip向Tika服务器发出以下请求时,我会得到一个包含准确文本、元数据和剥离图像的响应zip文件。

代码

let parsingData = fs.createReadStream('pdf_w_images_and_text.pdf');
axios({
method: 'PUT',
url: 'http://localhost:9998/unpack/all',
data: parsingData,
responseType: 'arraybuffer',
headers: {
'X-Tika-PDFExtractInlineImages': 'true',
'X-Tika-PDFExtractUniqueInlineImagesOnly': 'true'
},
})
.then((response) => {
console.log('Tika-server response recieved');
const outputFilename = __dirname+'\output.zip';
console.log('Attempting to convert Tika-server response data to ' + outputFilename);
fs.writeFileSync(outputFilename, response.data);
if (fs.existsSync(outputFilename)) {
console.log('Tika-server response data saved at ' + outputFilename);
}
})
.catch(function (error) {
console.error(error);
});

问题

我如何在NodeJ中对我的文件进行编码并将其附加到我的PUT请求,以便Tika服务器像我通过CURL发出请求时那样处理它?

Axios发送的请求的内容类型为application/x-wwww-form-urlencoded,因此无法检测和解析文件内容。

您可以通过传递文件的已知内容类型或application/octet stream的内容类型来更改此设置,以允许Apache Tika Server自动检测。

下面是一个基于问题代码的示例,说明了这一点:

#!/usr/bin/env node
const fs = require('fs')
const axios = require('axios')
let parsingData = fs.createReadStream('test.pdf');
axios({
method: 'PUT',
url: 'http://localhost:9998/unpack/all',
data: parsingData,
responseType: 'arraybuffer',
headers: {
'X-Tika-PDFExtractInlineImages': 'true',
'X-Tika-PDFExtractUniqueInlineImagesOnly': 'true',
'Content-Type': 'application/octet-stream'
},
})
.then((response) => {
console.log('Tika-server response recieved');
const outputFilename = __dirname+'/output.zip';
console.log('Attempting to convert Tika-server response data to ' + outputFilename);
fs.writeFileSync(outputFilename, response.data);
if (fs.existsSync(outputFilename)) {
console.log('Tika-server response data saved at ' + outputFilename);
}
})
.catch(function (error) {
console.error(error);
});

最新更新