2008-12-19 9 views
11

En tant que tutoriel "regarder sous les couvertures", je suis en train de créer un script PHP pour rassembler les emails d'une boîte aux lettres POP3. En essayant de faire usage de pièces jointes binaires, je suis coincé en essayant de comprendre ce qu'il faut faire avec les informations d'attachement.Enregistrement d'une chaîne Base64 sur un disque en tant que binaire en utilisant PHP

d'une chaîne qui serait recueillie à partir d'un e-mail:

------ = _ Part_16735_17392833.1229653992102 Content-Type: image/jpeg; name = trans2.jpg Content-Transfer-Encoding: base64 X-Pièce-jointe: f_fow87t5j0 Contenu-Disposition: pièce jointe; filename = trans2.jpg

/9j/4AAQSkZJRgABAgEASABIAAD/4QxrRXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUA AAABAAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAAUAAAAcgEyAAIAAAAUAAAAhodp

(...)

EAgEAgEAgEAgEAg8IBQRL/Lbe/tJrScHqZ2lkmE4XUP2XcSDZZ2VvZ28dtbsDIYmhkbRxAIJCAQC AQCAQf/ScyAQCAQCAQCAQCAQCAQCAQCAQCAQCAQf/9k = ------ = _Part_16735_17392833.1229653992102--

Y at-il un moyen de sauvegarder les données sur le disque de sorte qu'il serait dans un format utilisable?

Répondre

0

Couper la première et la dernière ligne, base64decode et enregistrer sous un nom de fichier donné.

fait.

0

Alors que de réinventer la roue a un divertissement et une valeur éducative, je voudrais essayer de résister à la tentation: Mailparse, Mail_mimeDecode

8

Si vous avez beaucoup de données à écrire qui doit être décodé avant d'écrire, je suggère d'utiliser les filtres de flux décoder afin que les données que vous écrivez ...

$fh = fopen('where_you_are_writing', 'wb'); 
stream_filter_append($fh, 'convert.base64-decode'); 

// Do a lot of writing here. It will be automatically decoded from base64. 

fclose($h); 
+0

enregistrer d mon jour, merci – Itako

0

J'ai eu une situation similaire, et c'est ce que j'ai fait. Comme indiqué précédemment, assurez-vous de supprimer les lignes superflues avant et après la chaîne base64.

<?php 
$INPUT = "inputfile_base64_encoded.txt"; 
$OUTPUT = "output_decoded.zip"; 
$contents = file_get_contents($INPUT); 
$bin = base64_decode($contents); 
file_put_contents($OUTPUT, $bin); 
?> 
2

J'ai essayé le ci-dessous, mais ne fonctionnait pas pour moi, générait un fichier image vide.

file_put_contents('img.png', base64_decode($base64string)); 

Voici comment cela a fonctionné pour moi:

$data = 'data:image/png;base64,AAAFBfj42Pj4'; 

list($type, $data) = explode(';', $data); 
list(, $data)  = explode(',', $data); 
$data = base64_decode($data); 

file_put_contents('/tmp/image.png', $data); 

Je pris le code de: How to save a PNG image server-side, from a base64 data string

+1

juste la 'liste ($ type, $ data) = explode (';', $ data); liste (, $ data) = explode (',', $ data); 'a fixé mon code. Merci beaucoup! –

0
function base64_decode_file($data) 
{ 
    if(preg_match('/^data\:([a-zA-Z]+\/[a-zA-Z]+);base64\,([a-zA-Z0-9\+\/]+\=*)$/', $data, $matches)) { 
     return [ 
       'mime' => $matches[1], 
       'data' => base64_decode($matches[2]), 
     ]; 
    } 
    return false; 
} 
0

Pour les grandes chaînes de base64 d'un DB dont vous avez besoin d'utiliser load()

$imgdata = $FromDB['BASE64']->load(); 
$imgdata = base64_decode($imgdata); 
file_put_contents($fileName, $imgdata); 
Questions connexes