2016-05-06 6 views
1

Ich habe eine Datei von der Verknüpfung herunterladen & muss in meinem lokalen Systemordner oder in einem Remote-Server-Ordner speichern. Das Szenario ist das: Ich habe eine Mailgun-Domain, wenn ich eine Mail an sie senden, Mailgun Store-Funktion (store()) speichert es mit allen Anhängen & benachrichtigt mich. Die Antwort von mailgun ist in catch_email_attachment() gefangen, ich bin in der Lage, die Antwort & erhalten den Link der angehängten Dateien. Wenn ich den Link direkt im Browser starte gibt es mir die angehängte Datei, kein Problem damit. Aber ich muss die Datei innerhalb catch_email_attachment() & herunterladen, um es in einem Ordner zu speichern.Laden Sie die Datei direkt von der URL in den lokalen Ordner oder einen Ordner auf dem Remote-Server

Die herunterladbare Datei ist als: "https://API:<API-KEY>@api.mailgun.net/v2/domains/sandboxa6e6ebce3f68475aa3xxxxxxxd60.mailgun.org/messages/eyJwIjogZmFsc2UsICJrIjogImQ0MmZjxxxxxxxxxxxxxxDQwNy1iYzhlLTA2OWMxY2U3MDg2NCIsIxxxxxxxxxxxxxx1Y2UiLCAiYyI6ICJpYWR0cmFpbGVycyJ9/attachments/0"

Meine Codes sind unten:

public function catch_email_attachment() 
{ 
    $data = $this->input->post(null, true); 
    if (!empty($data)) { 
     if (isset($data['attachments'])) { 
      /* 
      Output of $data['attachments'] is below: 
      [{"url": "https://api.mailgun.net/v2/domains/sandboxa6e6ebce3f68475aa3xxxxxxxd60.mailgun.org/messages/eyJwIjogZmFsc2UsICJrIjogImQ0MmZjxxxxxxxxxxxxxxDQwNy1iYzhlLTA2OWMxY2U3MDg2NCIsIxxxxxxxxxxxxxx1Y2UiLCAiYyI6ICJpYWR0cmFpbGVycyJ9/attachments/0", "content-type": "image/jpeg", "name": "xxxxxxx.jpeg", "size": 9498}] 
      */ 

      copy('https://API:[email protected]/v2/domains/sandboxa6e6ebce3f68475axxxxxxxxxxxxxxxxxxxxxxxxxxxx.mailgun.org/messages/eyJwIjogZmFsc2UxxxxxxxxxxxxxxxxxxxxxxxxxxxxmUtNDQwNy1iYzhlLTA2OWMxY2U3MDg2NCIxxxxxxxxxxxxxxxxxxxxxxxxxxxx1Y2UiLCAiYyI6ICJpYWR0cmFpbGVycyJ9/attachments/0', '/var/www/download_loc/'); 
     } 
    } 
} 

I refered haben: https://stackoverflow.com/a/26330976/4229270

https://stackoverflow.com/a/6594030/4229270

https://stackoverflow.com/a/724449/4229270

Können Sie mir helfen, das Problem zu lösen ... Danke im Voraus.

+0

swap 'copy' für' file_get_contents' und du bist fertig – Farkie

+0

Huh, es stellt sich heraus, dass 'copy' tatsächlich URLs behandelt. Ich sehe dein Problem jedoch. Ich werde eine Antwort posten. – Farkie

+0

@ Farkie - warten auf Ihre Antwort, habe ich mit 'file_get_contents' überprüft, nicht gelöst. hoffe du hilfst mir. – Sinto

Antwort

1

Es sieht aus wie $data['attachments'] ein Array json ist, so dass Sie brauchen so etwas wie:

$attachments = json_decode($data['attachments']); 
     $api_key = 'APIKEY'; 
     if ($attachments) { 
      foreach ($attachments as $attachment) { 

       $context = stream_context_create(array(
        'http' => array(
         'header' => "Authorization: Basic " . base64_encode("API:$api_key") 
        ) 
       )); 

       file_put_contents('/var/www/download_loc/' . $attachment->name, file_get_contents($attachment->url, false, $context)); 

      } 
     } 
+0

ja, $ data ['attachments'] es ist ein jsode data. Ich habe auch deinen Code überprüft, aber nicht gelöst. Und wenn ich "$ attachment-> url" im Browser starte, wie ich bereits sagte, wird die Datei heruntergeladen. – Sinto

+0

Ich habe auch Ordner Berechtigungen gesetzt, es geht immer noch nicht gut. – Sinto

+0

Hallo Sinto, ich habe überprüft und mein Code tut definitiv, was Sie erwarten würden.Müssen Sie nicht das 'API: @' Teil hinzufügen? – Farkie

0

die oben Antwort ist mürrische hilfreich für mich. Was ich getan habe & bekam ist:

Mailgun geben Antwort auf unsere Hook-Funktion, die wir in unserer Maingun-Domäne setzen. Fangen Sie die Antwort von Mailgun als:

$data = $this->input->post(null, true); 
$attachments = json_decode($data['attachments']); 
$apikey = 'API:<API_KEY>@'; 
foreach ($attachments as $attachment) { 
    $st = strpos($attachment->url, 'https://'); 
    if ($st !== false) { 
     $attachment->url = str_replace('https://', 'https://'.$apikey, $attachment->url); 
     $temp_name = $attachment->name; 
     $file_path = '<PATH_TO_DOWNLOAD>'.$temp_name; 
     copy($attachment->url, $file_path); // Downloading file to our path 
    } 
} 

Sie müssen Endpunkt von Mailgun Antwort überprüfen. Und, muss entsprechend in oder Code setzen. Außerdem müssen wir setzen API KEY & PFAD ZUM DOWNLOAD.

Der Speicherlink von Mailgun wird zu "xx.api.mailgun.net" über "api.mailgun.net" sein. Es wird wie "si.api.mailgun.net", "so.api.mailgun.net", "se.api.mailgun.net", "sw.api.mailgun.net", usw. sein. Die URL zu erhalten die Anlagendaten

ZB wäre: https://API:[email protected]/v3/domains/YOUR_MAILGUN_DOMAIN/messages/xxxxxxxxxxxxxxxxxxxxxxxxxxx=/attachments/0

die zurückgegebenen Daten aus der API die URL zurückkehren wird die gespeicherte Nachricht zu erhalten: (Artikel> Anhänge> url)

Bitte beachten: https://documentation.mailgun.com/en/latest/api-sending.html#retrieving-stored-messages

+0

https://documentation.mailgun.com/de/latest/api-sending.html#retrieving-stored-messages – Sinto

Verwandte Themen