簡體   English   中英

AWS Lambda:創建和下載 EXCEL 文件時出現編碼問題

[英]AWS Lambda: encoding problem when creating and downloading EXCEL file

我正在創建一個微服務來動態生成 EXCEL 個文件並下載它們。

我有一個 AWS Api 網關和一個 Python 3.8 Lambda function。要創建 EXCEL,我使用 Openpyxl package。

該文件生成的很好,但是當我下載它時,我似乎遇到了一些我無法弄清楚的編碼問題。

Lambda

在這里,我總結了 function,突出顯示結尾,我將文件保存到緩沖區並返回。

wb = I create my Workbook correctly

buffer = io.BytesIO()
wb.save(buffer)
    
excel_final = buffer.getvalue()
buffer.close()
         
response = excel_final

return response

在測試 Lambda output 時,我看到了這個響應,看起來 Unicode:

“PK \b }t T\u…………。”

Api 網關

Integration Response 設置為 Passthrough,Method Response 設置為 application/xml。 嘗試了不同的設置,但無法正常工作。

我在測試API方法的時候,也得到了如下格式的數據,我認為是解碼后的utf-8:

“PK�u�TAMb�docProps/app.xmlM�= 1D�q�A�Bb@�R�{/�dC�B~�9�noF�g*�-�T� "����N]��n��h��cy;ΓHI`������M��F��r��xN��pe'å; rm��5��&����.i ^PK�u�T�z��docProps/core.xml��N�0�_e�u�V=DY.C�@Bb�[�x[E�F�Q�'-[ ������V����

Javascript

在我的request.onload中,我得到字節響應並將其轉換為 Blob 以供下載。

let blob = this.response;
let final_blob = new Blob([blob], {type: 'application/xml'})

該文件已下載但被識別為已損壞。 無法打開它。

測試

我在 Lambda 或 Javascript 中嘗試了不同的內容類型、編碼/編碼,但從未成功。

歡迎任何線索!

我終於讓它工作了,我可以直接從 Lambda 下載 PDF、EXCEL 或 ZIP 文件,而無需實際將文件存儲在 S3 存儲桶中。

Lambda

Lambdas 和 Api 網關之間的通信需要 base64 編碼,所以在 Lambda 中我只返回裸 base64 編碼的二進制文件。

wb = I create my Workbook correctly 
buffer = io.BytesIO() 
wb.save(buffer) 
excel_final = buffer.getvalue() 
buffer.close()

return base64.b64encode(excel_final)

Api 網關 - 設置

首先 go 到您的 API 的設置,並在“二進制媒體類型”中添加application/ms-excel

Api 網關 - 方法響應

在“200 的響應標頭”中添加Content-Type header。

在“Response Body for 200”處添加application/ms-excel response model

Api 網關 - 集成響應

Content handling設置為Convert to binary (if needed)

在“Header Mappings”處將Content-Type值設置為application/ms-excel

前端

現在您將收到一個二進制文件作為您的響應。 只需生成 blob 並根據需要下載即可。

let blob = this.response;
let final_blob = new Blob([blob], {type: 'application/xml'});

// In my case I generate a link and click it

結論

在我的菜鳥中,我一直在搞亂配置,鏈中總是有問題。 在我的辯護中,我必須說文檔並沒有太大幫助。

一旦我讓它開始工作,它看起來就不是什么麻煩事了,而且對任何類型的二進制文件都很有吸引力。

使用 S3 方法,您不需要存儲一個文件,再次請求下載它,最后將它從存儲桶中刪除。

希望能幫助到你!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM