2017-08-13 3 views
0

フォームを使用してS3にファイルをアップロードしようとしています。このフォームには他にもいくつかのデータがありますが、ファイルはバケットにアップロードされますが、残りのデータをラムダ関数で使用してRDSインスタンスのmysqlデータベースを更新する方法はわかりません。ここでlambdaのpythonを使用してファイルをs3にアップロードした後にフォームデータで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> 

あなたが見ることができるように、私は私のデータベースに保存する必要がある変数の束を持っている、と私はどのように得ることはありませんラムダ関数でそれらを呼び出す。ラムダ関数は、データベースに書き込むことができます。 S3バケットがファイルを受け取ったときにデータベースに書き込むことができるハードコードされたSQL文があり、それ自体でトリガされます。 これは(から適応: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 

私はこれを実現することができる方法上の任意のアイデア?私はそれが本当にばかげたものだと確信していますが、私は今それを数日中やろうとしており、それを理解できないようです。

答えて

0

S3にすべてを正常にアップロードしたら、S3からLambdaにトリガーを作成できます。このイベントには、アップロードされたS3オブジェクトに関するすべての情報が含まれています。

また、S3オブジェクトを読み取り、必要なフィールドを抽出してRDSに格納することもできます。

以下は、S3 Trigger to Lambdaを作成するためのドキュメントです。

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

また、新しいポストに基づいてトリガをカスタマイズ更新または削除することができます。

これが役に立ちます。

+0

私の質問は、フィールドを抽出する方法です。私はその部分をする方法を知らない。私はラムダをアップロードし、トリガし、RDSに書き込むことができますが、フォームからフィールドを取得する方法はありません。どうやってやるの? – DDares

+0

S3ファイルに表示される形式は何ですか? – Kannaiyan

+0

私はその疑問についてはわかりません。フォーマットはどういう意味ですか?それはビデオか写真のどちらかです。 – DDares

関連する問題