![](/img/trans.png)
[英]Error "Read-only file system" in AWS Lambda when downloading a file from S3
[英]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.