2008-12-19 15 views
11

Como un tutorial de "mira bajo las sábanas" estoy construyendo un script de PHP para recopilar correos electrónicos de un buzón POP3. Al intentar utilizar archivos adjuntos binarios estoy atascado tratando de averiguar qué hacer con la información del archivo adjunto.Guardar una cadena de Base64 en el disco como un binario usando PHP

Dada una cadena que se desprende de un correo electrónico:

------ = _ Part_16735_17392833.1229653992102 Content-Type: image/jpeg; name = trans2.jpg Content-Transfer-Encoding: base64 X-Attachment-Id: f_fow87t5j0 Content-Disposition: attachment; nombre de archivo = trans2.jpg

/9J/4AAQSkZJRgABAgEASABIAAD/4QxrRXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUA AAABAAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAAUAAAAcgEyAAIAAAAUAAAAhodp

(...)

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

¿Hay alguna? forma de guardar los datos en el disco para que esté en un formato utilizable?

Respuesta

0

Corte la primera y la última línea, base64decode y guárdelo debajo del nombre del archivo.

hecho.

0

Mientras que reinventar la rueda tiene un poco de entretenimiento y valor educativo, me gustaría tratar de resistir la tentación: Mailparse, Mail_mimeDecode

8

Si usted tiene una gran cantidad de datos para escribir que necesita ser decodificado antes de escribir se recomienda usar filtros de secuencia de modo decodificar los datos a medida que lo escribe ...

$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

Guardar d mi día, gracias – Itako

0

Tuve una situación similar, y esto es lo que hice. Como se señaló anteriormente, asegúrese de eliminar las líneas extrañas antes y después de la cadena 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

He intentado lo siguiente pero no funcionó para mí, estaba generando un archivo de imagen vacío.

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

esta es la forma en que trabajó para mí:

$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); 

Tomé el código de: How to save a PNG image server-side, from a base64 data string

+1

solo la 'lista ($ tipo, $ datos) = explotar (';', $ datos); list (, $ data) = explode (',', $ data); 'corrigió mi código. ¡Muchas gracias! –

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

Para las cadenas base64 grandes desde una base de datos que necesita utilizar load()

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