En php, je souhaite télécharger un fichier s3 sur le navigateur sans le stocker sur mon serveur

StackOverflow https://stackoverflow.com/questions/772505

Question

J'ai des fichiers sur le S3 d'Amazon.Ils sont nommés avec un identifiant unique afin qu'il n'y ait pas de doublons.J'y accède en utilisant une URL autorisée.Je dois pouvoir les transmettre au navigateur, mais je dois les renommer.En ce moment, j'utilise fopen, mais il télécharge le fichier sur mon serveur avant de le transmettre au navigateur.Comment puis-je faire en sorte que les fichiers « transitent » par mon serveur vers le navigateur ?Ou comment puis-je mettre le téléchargement en mémoire tampon - en téléchargeant un petit morceau sur mon serveur et en le transmettant au navigateur lors du téléchargement du morceau suivant ?

De plus, j'aimerais vraiment utiliser CloudFront mais ils ne proposent pas d'URL authentifiées.Je pense que je peux utiliser CURL pour envoyer des informations d'identification pour la demande. Puis-je effectuer ce type de service de fichiers « pass through » avec CURL ?

Merci!

Était-ce utile?

La solution

Je ne connais pas le fonctionnement de S3, donc je ne sais pas si cette solution est possible.Mais ne pourriez-vous pas simplement rediriger le navigateur de l'utilisateur vers le fichier ?Si je comprends bien, S3 vous permet de créer des URL Web pour n'importe lequel des fichiers de votre compartiment.Donc, si, par exemple, il s'agit de téléchargements payants, vous pouvez alors demander à S3 de générer une URL temporaire pour ce téléchargement puis supprimez-le une fois que l'utilisateur l'a téléchargé.

Si ce n'est pas une option, vous pouvez essayer ces classes PHP :

  • Client de protocole HTTP - Une classe qui implémente les requêtes vers les ressources HTTP (utilisées par le wrapper de flux ci-dessous).Permet de diffuser les requêtes.
  • gHttp - Un wrapper de flux HTTP qui vous permet de traiter les ressources HTTP distantes comme des fichiers, en utilisant des fonctions telles que fopen(), fread(), etc.
  • Encapsuleur de flux Amazon S3 - Un wrapper de flux Amazon S3 du même développeur que gHttp.Permet également d'accéder aux ressources distantes comme des fichiers ordinaires via fopen('s3://...').

Modifier:

Cette page contient des informations sur la façon de "pré-authentifier" une demande en codant la clé d'authentification dans l'URL.C'est sous la section intitulée : Alternative à l'authentification de demande de chaîne de requête.

// I'm only implementing the parts required for GET requests.
// POST uploads will require additional components.
function getStringToSign($req, $expires, $uri) {
   return "$req\n\n\n$expires\n$uri";
}

function encodeSignature($sig, $key) {
    $sig = utf8_encode($sig);
    $sig = hash_hmac('sha1', $sig, $key);
    $sig = base64_encode($sig);
    return urlencode($sig);
}

$expires = strtotime('+1 hour');
$stringToSign = getStringToSign('GET', $expires, $uri);
$signature = encodeSignature($stringToSign, $awsKey);

$url .= '?AWSAccessKeyId='.$awsKeyId
       .'&Expires='.$expires
       .'&Signature='.$signature;

Ensuite, redirigez simplement l'utilisateur vers $url, et ils devraient pouvoir télécharger le fichier.La signature est codée par un système de chiffrement unidirectionnel (sha1), il n'y a donc aucun risque que votre clé d'accès secrète AWS soit découverte.

Autres conseils

Avez-vous essayé d'utiliser http_get, avec request_options pour spécifier le httpauth et httpauthtype? Bien que je ne me souviens pas si cette méthode suppose une chaîne type valide, ce qui pourrait ne pas fonctionner pour le bien binaire.

Si tel est réussi, alors vous devriez être en mesure de fournir le type MIME correct et écrire dans le navigateur.

Avez-vous bu essayé juste en utilisant readfile ( " http: // nom d'utilisateur: mot de passe @ hôte / nom de fichier. poste ")?

Ce sera tout simplement contournement et d'écrire directement au OutputBuffer, si le type de contenu est une préoccupation que vous devez vérifier que la première.

Utilisation en URL comme argument pour readfile exige également que PHP est compilé avec urlwrapper-support.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top