2016-08-23 4 views
1

Ich habe einen FileController mit einer addAction Methode herunterladen, die eine oder mehr Dateien in der Datenbank speichert:Wie kann ich Dateien aus der Datenbank

$files = []; 

$form = $this->createForm(MultipleFilesType::class, []); 
$form->handleRequest($request); 

if ($form->isSubmitted() && $form->isValid()) { 

    $files = $form->get("files")->getData(); 


    foreach ($files as $key => $file) 
    { 
     /* @var $uploadedFile UploadedFile */ 
     $uploadedFile = $file["file"]; 

     if ($uploadedFile->getError()) { 
      $request->getSession()->getFlashBag()->add('warning', $uploadedFile->getErrorMessage()); 
     } else { 

      $file = (new File()) 
        ->setName($uploadedFile->getClientOriginalName()) 
        ->setContent(file_get_contents($uploadedFile->getPathname())) 
        ->setType($uploadedFile->guessExtension()) 
      ; 

      $this->manager()->persist($file); 
      $this->manager()->flush(); 


     } 
    } 
    // ... 
} 

Und dann habe ich ein downloadAction:

public function _downloadAction($file, Request $request) 
{ 
    $response = new Response(); 
    $response->setContent($file->getContent()); 

    $d = $response->headers->makeDisposition(
     ResponseHeaderBag::DISPOSITION_ATTACHMENT, preg_replace('/[^a-zA-Z0-9-_\. ]/', "", $file->getName()) 
    ); 

    $response->headers->set("Content-Type", $file->getType()); 
    $response->headers->set('Content-Disposition', $d); 

    return $response; 
} 

Also habe ich mit dem obigen Code versucht. Meine Dateien scheinen gut hochgeladen zu sein, aber wenn ich versuche, herunterzuladen, sehe ich mich mit einigen Problemen konfrontiert, abhängig vom Typ der Datei.

HTML- und EML-Dateien funktionieren einwandfrei. Microsoft Office-Dateien (odt, xml, etc): können sie nicht öffnen, da sie beschädigt sind. Bilddateien: Ich erhalte eine "Dies ist keine XX-Datei, Datei starten mit 0xc3 0xbf"

Also ... Was ist falsch in meinem Code? Vielleicht gibt es ein paar Möglichkeiten, wie ich das besser machen kann, aber ich bin neu beim Hochladen/Herunterladen von Dateien und ich kämpfe ziemlich viel. Angenommen, ich muss Datenbank verwenden, um die Datei zu speichern.

EDIT:

habe ich versucht, eine in der dump(file_get_contents($uploadedFile->getPathname())); addAction Methode und dump($file->getContent()); in _downloadAction.

Die Ergebnisse sind sehr unterschiedlich (und sie sollten nicht !!). Die erste Dump zeigt viele mysteriöse Charaktere wie: ▓│┤ÁÂÀ © ╣║┬├─┼ãÃ╚╔╩ÊËÈıÍÎÏ┘┌ßÔÒõÕμþÞÚÛ ± ‗¾¶§ ÷

und die zweite verwendet fast nur alphanumerische Zeichen .

Ich denke, ich sollte tatsächlich versuchen, Zeichen zu entkommen, wenn ich den Inhalt in der Datenbank speichern. Ich versuchte mysql_escape_string(file_get_contents($uploadedFile->getPathname())), aber es löst das Problem nicht. Der ursprüngliche Inhalt und der heruntergeladene sind immer noch unterschiedlich.

+2

Ich speichere immer Dateien auf der Festplatte und benutze BinaryFileResponse, um Dateien zu liefern. Das Speichern von Dateien in der Datenbank ist aus meiner Sicht keine gute Wahl und ich versuche es so gut wie möglich zu vermeiden. – Carlos

+0

Nun, die Wahl, wo ich die Dateien speichern sollte, liegt nicht bei mir. – abernard

+1

Nur eine Vermutung. Aber versuchen Sie, einen mysql_real_escape_string() oder mysqli_real_escape_string() zu Ihrem file_get_contents zu machen. –

Antwort

1

Also habe ich es endlich geschafft, mit einer Kombination von base64_encode() in der addAction-Methode und base64_decode() in der downloadAction-Methode().

+0

Ich stehe vor dem gleichen Problem. Für mich kann ich die Ausgabe in der Konsole erhalten. Aber das Herunterladen als Datei. Irgendwelche Ideen ? –

Verwandte Themen