从 s3 获取 PDF 文件

问题描述 投票:0回答:1

所以我将这个pdf文件上传到s3,这一切都很好,但第二步是从s3获取该pdf,这样我就可以随时下载它,但是当我到达下载步骤时,我得到一个0字节的文件,我在 s3 上检查并且文件正在通过那里正确下载...这是我从 s3 获取文件的代码,它也进入 if 条件,还检查了来自 s3 的缓冲区大小并且它不为空:

const s3 = new AWS.S3({
                    accessKeyId: process.env.AWS_ID,
                    secretAccessKey: process.env.AWS_SECRET
                });

                const params = {
                    Bucket: `${process.env.AWS_BUCKET_NAME}/receipts`,
                    Key: `${transactionId}.pdf`
                };

                s3.getObject(params, async (err, data) => {
                    if (err) {
                        rollbar.error(err);
                        new Logger().error(err);
                        return RouteResponse.error('Error retrieving file from S3', res);
                    }

                
                    if (data.Body && Buffer.isBuffer(data.Body)) {
                        return new HtmlPdf().renderBuffer(res, data.Body);
                    }
                    return RouteResponse.error('File data is not valid', res);
                });
            } else {
                return RouteResponse.error('File not found or transaction does not exist', res);
            }

这是我的渲染缓冲区:

/**
     * renderBuffer
     *
     * @param { Response<unknown, Record<string, unknown>> }_res - Response
     * @param { Buffer } buffer - Buffer do arquivo
     */
    public async renderBuffer(_res: Response<unknown, Record<string, unknown>>, buffer: Buffer): Promise<void> {
        const readStream = new stream.PassThrough();
        readStream.end(buffer);
        _res.setHeader('Content-type', 'application/pdf');
        _res.setHeader('Content-disposition', `attachment; filename=report.pdf`);
        readStream.pipe(_res);
    }
    ```
node.js typescript amazon-web-services amazon-s3
1个回答
0
投票

几乎所有 AWS 开发工具包 API 调用都是异步的并返回承诺。如果您在回调中处理响应,如下所示,那么您对

get_object()
的调用会在
s3.getObject
回调发生之前完成,并且您的 `get_object() 函数实际上返回未定义。

function get_object(Bucket, Key)
{
    s3.getObject({ Bucket, Key }, async (err, data) => {
        if (err) {
            console.error("GetObject failed, err=", err);
        } else {
            // this is the return value of the callback function and is
            // NOT the return value of the get_object() call
            return data.Body.toString('utf-8');
        }
    });
    // implicit return undefined here
}

// data will (incorrectly) always be undefined
const data = get_object("somebucket", "somekey");

您可以修改代码以使用 async/await,例如:

async function get_object(Bucket, Key)
{
    const data = await s3.getObject({ Bucket, Key });
    return data.Body.toString('utf-8');
}

// data will (correctly) be the S3 object's body content
const data = await get_object("somebucket", "somekey");

另请注意,AWS JavaScript SDK v2 已更新,您应该考虑继续使用 v3。

© www.soinside.com 2019 - 2024. All rights reserved.