2015-11-23 13 views
11

Sto cercando di salvare i file nel DB usando BLOB. So che non è una buona pratica, ma deve essere fatta in questo modo.Impossibile leggere il PDF convertito da BLOB in Laravel 5?

In ogni caso il problema che sto affrontando è che i file PDF restituiti non sono più leggibili. Ma tutti gli altri file come docx, odt, txt, jpg e così via funzionano bene quando vengono convertiti dal blob.

public function store(Request $request) 
{ 
    $data = $request->all(); 

    $file = $request->file('file'); 

    $data['data'] = base64_encode(file_get_contents($file)); 
    $data['extension'] = $file->guessExtension(); 
    $data['name'] = $file->getClientOriginalName(); 

    $file = $this->fileRepo->create($data); 

    return jsend()->success() 
        ->message("Resource Created Successfully") 
        ->data($file->toArray()) 
        ->get(); 
} 

public function download($id) 
{ 
    $file = $this->fileRepo->find($id); 

    $randomDir = md5(time() . $file->id . $file->user->id . str_random()); 

    mkdir(public_path() . '/files/' . $randomDir); 

    $path = public_path() . '/files/' . $randomDir . '/' . html_entity_decode($file->name); 

    file_put_contents($path, base64_decode($file->data)); 

    header('Content-Description: File Transfer'); 

    return response()->download($path); 
} 

Dove sto andando male e c'è un modo speciale per archiviare i PDF in un campo blob?

+0

Forse i commenti [qui] (http://stackoverflow.com/a/8991231/717181) aiuto? – Luceos

+0

Per quanto posso dire, quel ragazzo l'ha risolto usando una lib di terze parti per codificarlo in linee di lunghezza 72, ma non sono sicuro di come farlo nella mia applicazione. Come codificare un file in base64 in php usando una certa lunghezza di linee? – Rohan

+1

Come diversi file prima del caricamento e dopo il download? qualcosa come 'diff before.pdf after.pdf'. –

risposta

1

È possibile che le intestazioni vengano restituite in modo errato e ciò causa la visualizzazione illeggibile del file.

costringerli sostituendo:

header('Content-Description: File Transfer'); 
return response()->download($path); 

Con:

$headers = array(
    'Content-Description: File Transfer', 
    'Content-Type: application/octet-stream', 
    'Content-Disposition: attachment; filename="' . $file->name . '"', 
    ); 

return response()->download($path, $file->name, $headers); 
0

È possibile impostare il ritorno intestazione del genere. è necessario utilizzare la risposta di Laravel cioè.

public function download($id) 
{ 
    $file = $this->fileRepo->find($id); 

    $randomDir = md5(time() . $file->id . $file->user->id . str_random()); 

    mkdir(public_path() . '/files/' . $randomDir); 

    $path = public_path() . '/files/' . $randomDir . '/' . html_entity_decode($file->name); 

    file_put_contents($path, base64_decode($file->data)); 

    return response()->download($path)->header('Content-Description', 'File Transfer'); 
}