【问题标题】:update mysql with form data after uploading file to s3 using lambda python使用 lambda python 将文件上传到 s3 后使用表单数据更新 mysql
【发布时间】:2017-08-13 22:19:22
【问题描述】:

我正在尝试使用表单将文件上传到 S3。该表单还有其他几个数据,虽然文件确实上传到存储桶,但我只是不明白如何获取其余数据以在 Lambda 函数中使用它来更新 RDS 实例中的 mysql 数据库。

这是我的表格(改编自http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-post-example.html

    <form name='form10' action="http://<?= $my_bucket ?>.s3.amazonaws.com/" method="post" enctype="multipart/form-data" onsubmit="return v.exec()">
        <input type="hidden" name="key" value="videos/${filename}" />
        <input type="hidden" name="acl" value="public-read" />
        <input type="hidden" name="X-Amz-Credential" value="<?= $access_key; ?>/<?= $short_date; ?>/<?= $region; ?>/s3/aws4_request" />
        <input type="hidden" name="X-Amz-Algorithm" value="AWS4-HMAC-SHA256" />
        <input type="hidden" name="X-Amz-Date" value="<?=$iso_date ; ?>" />
        <input type="hidden" name="Policy" value="<?=base64_encode($policy); ?>" />
        <input type="hidden" name="X-Amz-Signature" value="<?=$signature ?>" />
        <input type="hidden" name="success_action_redirect" value="<?= $success_redirect ?>" /> 

        <table summary="Playlist de Campa&ntilde;a" align=center border="1">
            <tr><td colspan="2" align="center">Agregar Videos a Playlist</td></tr>
            <tr><td>Selecciona tu Archivo:</td><td><input type="file" name="file" /></td></tr>
            <tr><td>Descripci&oacute;n del Video</td><td><input type="text" name="desc_video" value="" size="50"/></td></tr>
            <tr><td>Fecha Inicio:
                <input type=text name=start_date value="<?PHP echo $fecha_inicio; ?>"><a href="javascript:show_calendar('form10.start_date');" ><img src="images/show-calendar.gif" width="24" height="22" border="0" alt=""></a>
                </td><td>Fecha Terminaci&oacute;n
                <input type=text name=end_date value="<?PHP echo $fecha_termina;?>"><a href="javascript:show_calendar('form10.end_date');" ><img src="images/show-calendar.gif" width="24" height="22" border="0" alt=""></a>
                </td></tr>
            <tr><td>Hora Inicio:
                    <select name="hora_inicio">
                        <?PHP 
                        for ($hr = 0; $hr < 24; $hr++){
                            echo"<option value=$hr>$hr</option>";
                        } 
                        ?>
                            </select>:
                    <select name="mins_inicio">
                        <?PHP 
                        for ($hr = 0; $hr < 60; $hr+=5){
                            echo"<option value=$hr>$hr</option>";
                        } 
                        ?>
                        <option value="59">59</option>
                    </select></td>
            <td>Hora Terminaci&oacute;n:
                    <select name="hora_final">
                        <?PHP 
                        for ($hr = 0; $hr < 24; $hr++){
                            if($hr<>23){
                               echo"<option value=$hr>$hr</option>"; 
                            } else {
                               echo"<option value=$hr selected>$hr</option>"; 
                            }

                        } 
                        ?>
                            </select>:
                    <select name="mins_final">
                        <?PHP 
                        for ($hr = 0; $hr < 60; $hr+=5){
                            echo"<option value=$hr>$hr</option>";
                        } 
                        ?>
                        <option value="59" selected>59</option>
                    </select></td>        
            </tr>
            <tr><td colspan="2" align="center"><input type="submit" value="Continuar" /></td></tr>
        </table>
        <input type="hidden" name="step" value="sube" />
        <input type="hidden" name="tipo" value="<?PHP echo $tipo; ?>" />
        <input type="hidden" name="id_campana" value="<?PHP echo $id_campana; ?>" />
        <input type="hidden" name="fecha_inicio" value="<?PHP echo $fecha_inicio; ?>" />
        <input type="hidden" name="fecha_termina" value="<?PHP echo $fecha_termina; ?>" />

    </form>   

如您所见,我有一堆变量需要保存到我的数据库中,我只是不知道如何在 Lambda 函数中调用它们。 Lambda 函数可以写入数据库。我有一个能够写入数据库的硬编码 sql 语句,当 S3 存储桶接收到文件时它会自行触发。 这是我正在使用的 lambda 函数,(改编自:https://www.isc.upenn.edu/accessing-mysql-databases-aws-python-lambda-function

import sys
import logging
import rds_config
import pymysql
#rds settings
rds_host  = "xxxxxxxxxxxxxxxxxxxx.rds.amazonaws.com"
name = rds_config.db_username
password = rds_config.db_password
db_name = rds_config.db_name
logger = logging.getLogger()
logger.setLevel(logging.INFO)

try:
 conn = pymysql.connect(rds_host, user=name, passwd=password, db=db_name, connect_timeout=5)
except:
 logger.error("ERROR: Unexpected error: Could not connect to MySql instance.")
 sys.exit()
logger.info("SUCCESS: Connection to RDS mysql instance succeeded")
def lambda_handler(event, context):
 try:
    cur = conn.cursor()
    cur.execute("INSERT INTO archivos (id_cliente,id_campana,tipo_asset,id_tipo_asset,file_name,original_name,descripcion,file_type,date_begin,date_end,time_begin,time_end,MD5) VALUES (5,11,'Marca',3,'test.png','test.png','este es el video','png','2017-08-01','2017-08-30','00:00:00','23:59:00','90175908345798dhf')")
    conn.commit()
 except MySQLError as e:
    logger.error(e)
 return None

关于如何实现这一点的任何想法?我确信这真的很愚蠢,但我已经尝试了好几天了,但我似乎无法理解它。

【问题讨论】:

    标签: python mysql amazon-web-services amazon-s3 aws-lambda


    【解决方案1】:

    将所有内容成功上传到 S3 后,您可以创建从 S3 到 Lambda 的触发器。该事件包含有关上传的 S3 对象的所有信息。

    您还可以读取 S3 对象,提取所需的字段并将其存储到 RDS。

    以下是为 Lambda 创建 S3 触发器的文档。

    http://docs.aws.amazon.com/lambda/latest/dg/with-s3.html

    您还可以根据新帖子、更新或删除自定义触发器。

    希望这会有所帮助。

    【讨论】:

    • 我的问题是如何提取字段。我不知道该怎么做那部分。我可以上传、触发 lambda、写入 RDS,但不能从表单中获取字段。我该怎么做?
    • 我不确定这个问题。你是什​​么意思格式?它是视频或图片。
    • 当您使用多格式数据发布帖子时。它是文件,也是数据。如果您只是将文件发布到 s3,则可以将数据带到 lambda 端点并通过文件进行处理。在这种情况下,您需要做两篇文章,一篇用于 S3,另一篇用于 lamba 发布表单参数。如果你将它发布到 lambda,它将被发布为 json 数据。
    • 所以我无法在 s3 上接收数据,然后将其“中继”到 Lambda?很抱歉问这些基本问题,但我是 AWS 新手。
    • 如果您已将多部分数据上传到 S3。它应该作为 json 文件存储在 S3 对象中。我假设为 base64 数据的图像。您可以读取这些文件并解析这些 json 对象以获取您的数据。
    猜你喜欢
    • 1970-01-01
    • 2021-08-22
    • 2021-03-02
    • 2017-10-18
    • 2017-10-26
    • 1970-01-01
    • 1970-01-01
    • 2021-03-28
    • 2020-08-07
    相关资源
    最近更新 更多