#1 18-09-2007 20:54:45

jmleray
Tagglers
Lieu: Rome
Date d'inscription: 27-01-2006
Messages: 1000
Site web

Code PHP Amazon S3

Besoin d'aide pour comprendre ce que je dois faire avec ça ! Ça c'est le code PHP à utiliser pour pouvoir stocker ses fichiers sur Amazon et faire les différentes opérations.

Je dois créer un fichier à part avec ces instructions ou quoi d'autre (ref. http://docs.amazonwebservices.com/Amazo … 03-01/gsg/ )

Code:

$introMessage = "This file is a proof-of-concept of how to use Amazon S3 via PHP.  It implements object PUT/GET/DELETE, bucket PUT(create)/GET(list)/DELETE, and service GET(list all my buckets).  It sends your secret access key from your browser to your PHP server so <b>only use this over SSL or on a trusted network!</b>";

$S3_URL = "http://s3.amazonaws.com/";

// grab this with "pear install Crypt_HMAC"
require_once 'Crypt/HMAC.php';

// grab this with "pear install --onlyreqdeps HTTP_Request"
require_once 'HTTP/Request.php';
// Note that version HTTP_Request 1.3.0 has a BUG in it!  Change line
// 765 from:
//            (HTTP_REQUEST_METHOD_POST != $this->_method && empty($this->_postData) && empty($this->_postFiles))) {
// to:
//            (HTTP_REQUEST_METHOD_POST == $this->_method && empty($this->_postData) && empty($this->_postFiles))) {
// Without this change PUTs with non-empty content-type will fail!

// generic form fields
$fields = array("AWSAccessKeyId" => "keyId",
                "SecretAccessKey" => "secretKey",
                "Bucket (no slashes)" => "bucket",
                "Key" => "key",
                "Content-Type" => "contentType");
// submit button value
$submit = $_REQUEST['submit'];

if ($submit =="")  {
    // The simplest case -- just draw the input form
?>

<html>
  <head>
    <script type="text/javascript" language="text/javascript">
      <!--
          function showPutFields() { 
            document.getElementById("putFile").style.visibility = 'visible'; 
            document.getElementById("putCT").style.visibility = 'visible'; 
            return false; 
          }
          function hidePutFields() { 
            document.getElementById("putFile").style.visibility = 'hidden'; 
            document.getElementById("putCT").style.visibility = 'hidden'; 
            document.getElementById("fileName").value = ''; 
            return false; 
          }
          function putVisibility() { 
            if (document.getElementById("verb").options.selectedIndex == 1) 
              showPutFields(); 
            else 
              hidePutFields(); 
            return false;
          }
        -->
    </script>
    <title>S3/PHP proof-of-concept</title>
  </head>
  <body>
    <h1>S3/PHP proof-of-concept</h1>
    <? echo $introMessage ?>
    <hr/>
    <h1/>
    <form action="s3.php" method="POST" enctype="multipart/form-data">
      <table>
<?php
    foreach ($fields as $k => $v) {
        print "<tr><td>$k:</td><td><input name=\"$v\" value=\"\"/></td></tr>";
    }
?>
        <tr>
          <td>Operation:</td>
          <td>
              <select id="verb" onchange="putVisibility();" name="verb">
                <option value="GET">GET</option>
                <option value="PUT">PUT</option>
                <option value="DELETE">DELETE</option>
              </select>
          </td>
        </tr> 
        <tr id="putCT" style="visibility:hidden;">
          <td>Access Control Policy (PUT only):</td>
          <td>
            <select name="acl">
              <option value="private">private</option>
              <option value="public-read">public-read</option>
              <option value="public-read-write">public-read-write</option>
            </select>
          </td>
        </tr>
        <tr id="putFile" style="visibility:hidden;">
          <td colspan="2">File to PUT (PUT only): <input id="fileName" type="file" name="file"/></td>
        </tr>
      </table>
      <input type="submit" name="submit" value="Go!"/>
    </form>

<?php
    ob_end_flush();

} elseif ($submit == "Go!") {
    // User has entered parameters so let's do the S3 request!

    // pull off request parameters.
    $keyId = $_REQUEST['keyId'];
    $secretKey = $_REQUEST['secretKey'];
    $verb = $_REQUEST['verb'];
    $acl = $_REQUEST['acl'];
    $contentType = $_REQUEST['contentType'];
    $resource = $_REQUEST['bucket'] . "/" . $_REQUEST['key'];
    if ($resource == "/") {
        $resource = "";
    }

    if ($verb == "PUT") {
        if ($_REQUEST['key'] == "") {
            $_FILES['file']['tmp_name'] = "";
        }
        if ($_FILES['file']['tmp_name'] == "" && $_REQUEST['key']!="") {
            error("Must specify a file to use with object PUT");
        }
        if (is_uploaded_file($_FILES['file']['tmp_name'])) {
            $filePath = $_FILES['file']['tmp_name'];
        } elseif ($_FILES['file']['tmp_name'] != "") {
            error("Serious error");
        }
    } else {
        if ($_FILES['file']['tmp_name'] != "") {
            error("Must not specify a file to use with anything but PUT");
        }
    }

    $methods = array("GET"=>1, "DELETE"=>1, "PUT"=>1);
    if ($methods[$verb] == 0) {
        error("Unknown verb $verb");
    }

    $httpDate = gmdate(DATE_RFC822);
    $stringToSign = "$verb\n\n$contentType\n$httpDate\nx-amz-acl:$acl\n/$resource";
    $hasher =& new Crypt_HMAC($secretKey, "sha1");
    $signature = hex2b64($hasher->hash($stringToSign));
    //    error("[$stringToSign,$signature]");

    $req =& new HTTP_Request($S3_URL . $resource);
    $req->setMethod($verb);
    $req->addHeader("content-type", $contentType);
    $req->addHeader("Date", $httpDate);
    $req->addHeader("x-amz-acl", $acl);
    $req->addHeader("Authorization", "AWS " . $keyId . ":" . $signature);
    if ($filePath != "") {
        $req->setBody(file_get_contents($filePath));
    }
    $req->sendRequest();

    $ct = $req->getResponseHeader("content-type");
    if ($ct == "application/xml") $ct = "text/xml";
    header("content-type: $ct");
    ob_end_flush();

    if ($req->getResponseCode() >= 300) {
        print $req->getResponseBody();
        return;
    }

    if ($verb != "GET") {
        print "$resource ${verb}ed successfully.";
        return;
    }

    print $req->getResponseBody();

} else {
    print "Unknown submit! [$submit]";
}

die;

function hex2b64($str) {
    $raw = '';
    for ($i=0; $i < strlen($str); $i+=2) {
        $raw .= chr(hexdec(substr($str, $i, 2)));
    }
    return base64_encode($raw);
}

function error($str) {
    print "<div style='color: red;'><h2><pre>$str</pre></h2></div>";
    die;
}

function dump($var) {
    print "<pre>";
    print_r($var);
    print "</pre>";
}
?>

Merci d'avance smile

Hors ligne

 

#2 18-09-2007 22:10:54

Anonymus
Crying Freeman
Lieu: lat:45.387842, long:4.78314
Date d'inscription: 04-07-2005
Messages: 1164
Site web

Re: Code PHP Amazon S3

Bon, déjà, t'as besoin de 3 choses :
la librairie pear installée sur le serveur,
le fichier /Crypt/HMac.php sur ton serveur
le fichier /HTTP/Request.php sur ton serveur

déjà, est ce que t'as ca ?

Hors ligne

 

#3 19-09-2007 00:01:20

jmleray
Tagglers
Lieu: Rome
Date d'inscription: 27-01-2006
Messages: 1000
Site web

Re: Code PHP Amazon S3

Anonymus, merci de ta réponse.

Je dispose de Red Hat 9 avec les services suivants :

Apache ASP support     
SSI support    
PHP support    
CGI support    
mod_perl support    
mod_python support

A noter que pour effectuer les mêmes opérations qu'avec le code PHP ci-dessus je peux me servir des langages suivants :

# Java
# Perl
# PHP
# C#
# Python
# Ruby
# HTTP

En gros, ce que je veux faire est décrit ici : http://www.holovaty.com/blog/archive/2006/04/07/0927

Or en lisant cet article j'ai vu que lui utilise Python, alors je me suis dit que pour moi PHP était peut-être plus facile. Mais bon, ne connaissant ni l'un ni l'autre, peut-être que Java serait la solution, j'en ai vraiment aucune idée !

Le tout c'est de savoir par où commencer...

Hors ligne

 

#4 19-09-2007 00:23:54

Anonymus
Crying Freeman
Lieu: lat:45.387842, long:4.78314
Date d'inscription: 04-07-2005
Messages: 1164
Site web

Re: Code PHP Amazon S3

T'as essayé, de mettre ca sur une page ?
C'est du code php. Tu le mets sur une page, et t'appelles la page, ca doit marcher tout seul.

Bon, faut comme même remplir le tableau ici :
$fields = array("AWSAccessKeyId" => "keyId",
                "SecretAccessKey" => "secretKey",
                "Bucket (no slashes)" => "bucket",
                "Key" => "key",
                "Content-Type" => "contentType");

avec tes données > remplaces KeyId par la clé que t'as donné Amazon pour te servir des kits programmes, etc..

Nico.

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 R. Andersson