0

情景

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

问题

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

当我通过 CURL 向 Tika 服务器发出以下请求时curl -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,我得到一个响应 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);
});

问题

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

4

1 回答 1

1

Axios 正在发送内容类型为application/x-www-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);
});
于 2021-06-13T12:41:03.707 回答