簡體   English   中英

如何從用Java編寫的AWS Lambda返回二進制數據

[英]How to return binary data from AWS Lambda written in Java

鑒於現在可以在Amazon Api Gateway和Amazon Lambda中處理二進制數據,我想嘗試制作一個返回Excel電子表格的Amazon Lambda終端節點。 這是完全可以這樣做使用節點/ JS,這表現在這里 不幸的是,每當我嘗試使用Java進行此操作時,它都會崩潰。

我最初的嘗試是使用apache XSSFWorkbook創建一個簡單的工作簿,將其寫入RequestStreamHandler提供的輸出流中,然后完成。

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestStreamHandler;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class FileRequestHandler implements RequestStreamHandler {
    public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context)
            throws IOException {
        Workbook wb = new XSSFWorkbook();
        String sheetName = "Problem sheet";
        wb.createSheet(sheetName);
        wb.write(outputStream);
    }
}

在本地測試時,可以將輸出流通過管道傳輸到文件,從而生成有效的輸出excel文件。

import com.amazonaws.util.StringInputStream;
import org.junit.Test;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

public class FileRequestHandlerTest {

    @Test
    public void shouldCreateExcelFile() throws IOException {
        FileRequestHandler fileRequestHandler = new FileRequestHandler();
        InputStream inputStream = new StringInputStream("hello world");
        String fileName = "FileRequestLambda";
        String path = fileName + ".xlsx";
        FileOutputStream fileOutputStream = new FileOutputStream(path);

        fileRequestHandler.handleRequest(inputStream, fileOutputStream, TestUtils.createContext());
        fileOutputStream.close();
    }
}

但是,當我在Amazon Lambda中運行它時,我得到了格式錯誤的二進制輸出:

PKn��I_rels/.rels���j�0��}
�{㴃1F�^Ơ�2��l%1I,c�[��3�l
l�����H��4��R�l��·����q}*�2�������;�*��
t"�^�l;1W)�N�iD)ejuD�cKz[׷:}g����@:�
�3����4�7N�s_ni�G�M*7�����2R�+��    �2�/�����b��mC�Pp�ֱ$POyQ�抒�DsZ��IС�'un���~�PK����OPKn��I[Content_Types].xml�SMO1��+6��m��1���G%��β
�J[���MDL0�S;yo�{3i�Ӎ5�c��5lć�B'��nѰ��S}˪��)0�aÜg��`<�L��԰.�p'D�ZH�t��>Z�Tƅ ��@q=��]F��\4�=`+���P�!-!S.�v�@��+�����N�tEV=nHe7���S,;K]_h7Q+�W8߶Z��re��c�U�����}�����g�&A��,���H�$�B<��`�"�Jb���"���I�N�1���A���CI�#��܂v��?|\�{��`�b������$�c�D��|2�PKKB�>'PKn��IdocProps/app.xmlM��
�0D�~EȽ��ADҔ���A? ��6�lB�J?ߜ���0���ͯ��)�@��׍H6���V>��$;�SC
;̢(�ra�g�l�&�e��L!y�%��49��`_���4G���F��J��Wg
�GS�b����
~�PK�|wؑ�PKn��IdocProps/core.xmlm��J�0F��!�m�V����(���Ż��m��!�v}{ӺVP/g��a��wG5�wp~4��4�1-�u���n��c�גOFC����6��e�888c��<�홰
B��/P�g��q�b��!��'��W�)��"
�<p�S��I)Ŧ�onZR�@��Ќ�6�S�߅u��G?n�<��\�\����ۛ���t���p|��f� Q4��ac&ߓ��������i��"�UG+vV��z�ɯ���U�^�H@�����IM�$�&�PK����PKn��Ixl/sharedStrings.xml=�A� ツ��.z0Ɣ�`������,�����q2��o�ԇ���N�E��x5�z>�W���(R�K���^4{�����ŀ�5��y�V����y�m�XV�\�.��j�����
8�PKp��&x�PKn��I
xl/styles.xml���n� ��>bop2TQ��P)U��RWb�6*�����ӤS�Nw�s���3ߍ֐���t��(l��������ҝx�!N=@$ɀ��}��3c���ʰr`:i��2��w,�
�d
�T��R#�voc �;c�iE���Û��E<|��4Iɣ�����F#��n���B�z�F���y�j3y��yҥ�jt>���2��Lژ�!6��2F��OY��4@M�!���G��������1�t��y��p��" n����u�����a�ΦDi�9�&#��%I��9��}���cK��T��$?������`J������7���o��f��M|PK�1X@C�PKn��Ixl/workbook.xml���N�0��<��wj�E�8��J��P�;�����hmZ'Q�#����~;���;vCJ6   �Fà���"��|x|�}���#]����C�0�<֜'=�WiG��#y���O#�2i@������+`!��F�{��-�O�!/B�r)�;&h�����zOz�o����xO��I2����YuĔ��s�u��<J8Q�z6��Qm�:�,�c��Z�����PK1����dPKn��Ixl/_rels/workbook.xml.rels��Mk1@���0�nv-�R�^����0$����$dƯo���R�OC�ރ�-��������@Sՠ(�����ܼ?��b��p�����d�AJ�¾O�
#�/�޴f�iD�b�P6m�#Jy�N'�[�HO��E�k����3�W���ܑ`���Zri㪐����?�ض��e�������7p�wj�W5r���]������=�|���<:�[p��7�O�PK��4��9PKn��Ixl/worksheets/sheet1.xmleP�N�0���މ�V��THU$���$��j���[��c�����3��-v�nT���/a����7�Zߗ��z���]uQ���0 ��zJD�[�C3�3!�    }|鈝�H��ab4�br�^���v�z���:�)P1v%ܭ@W�"|�8�?X�ܚ���C[B�'�~��ȅO������Tyb�bgN�<�|��$��ƙ��{#&����h��>��D�Ű�z�#��6��8�LF�dQ����,4�xS����/PK�_�Y�lPKn��I����O_rels/.relsPKn��IKB�>'[Content_Types].xmlPKn��I�|wؑ��docProps/app.xmlPKn��I����mdocProps/core.xmlPKn��Ip��&x��xl/sharedStrings.xmlPKn��I�1X@C�
nxl/styles.xmlPKn��I1����d�xl/workbook.xmlPKn��I��4��9xl/_rels/workbook.xml.relsPKn��I�_�Y�l$   xl/worksheets/sheet1.xmlPK      ?Z

輸出約為5KB,而我本地計算機上的輸出約為3KB。 對於Amazon Lambda上的Java,二進制輸出通常看起來是一個問題。 當我運行一些將圖像寫入輸出字符串的代碼時,它也可以在本地運行,但是從Amazon Lambda運行時,圖像的大小和亂碼是原來的兩倍。

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestStreamHandler;

import java.io.*;
import java.net.URL;

public class ImageRequestHandler implements RequestStreamHandler {
    public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context)
            throws IOException {
        String address = "https://upload.wikimedia.org/wikipedia/commons/thumb/1/1d/AmazonWebservices_Logo.svg/580px-AmazonWebservices_Logo.svg.png";
        URL url = new URL(address);

        InputStream in = new BufferedInputStream(url.openStream());
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        byte[] buf = new byte[1024];
        int n;
        while (-1!=(n=in.read(buf)))
        {
            out.write(buf, 0, n);
        }
        out.close();
        in.close();
        byte[] response = out.toByteArray();
        outputStream.write(response);
    }
}

was輸入和輸出流的類型為:

lambdainternal.util.NativeMemoryAsInputStream lambdainternal.util.LambdaByteArrayOutputStream

救命?

我從Amazon Lambda返回JPG圖像時遇到了同樣的問題,並且找到了解決方法。 您需要使用base64編碼對輸出流進行編碼:

OutputStream encodedStream = Base64.getEncoder().wrap(outputStream);
encodedStream.write(response);
encodedStream.close();

然后,您需要按如下所述更新函數的“方法響應”和“集成響應”: AWS Gateway API base64Decode產生亂碼的二進制代碼?

暫無
暫無

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

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