2016-04-05 8 views
0

Ich bin ein neuer Entwickler, der in einem Unternehmen auf einer Website arbeitet. Wir haben einen Fehler beim Importieren von Excel-Dateien, es akzeptiert keine xls als gültige Erweiterung, aber xlsx und andere werden akzeptiert. Hier ist die Methode, die den Fehler gibt.Kann .xls nicht importieren - Symfony PHP

public function orderAddUpload (Request $ request) {

/* 
    Filepath: /web/uploads/files/{entity_name}/{entity_id}/{filename} 
    */ 

    $response = array(); 

    $entity = $request->request->get('upload_entity'); 
    $id  = $request->request->get('upload_id'); 
    $user = $this->get('security.context')->getToken()->getUser(); 

    $em = $this->getDoctrine()->getManager(); 

    $valid_ext = array('doc', 'docx', 'xls', 'xlsx', 'pdf', 'txt', 'gif', 'jpg', 'jpeg', 'png'); 

    $file = $request->files->get('files'); 
    if(is_array($file)) $file = reset($file); 


    try{ 
     if(empty($file)){ 
      throw new Exception($this->get('translator')->trans('upload.failure'), 1); 
     } 

     if(! in_array($file->guessExtension(), $valid_ext)){ 
      throw new Exception($this->get('translator')->trans('file.invalid.extension')." (" . $file->guessExtension() . "), ".$this->get('translator')->trans('only')." ".implode(', ', $valid_ext) . " ".$this->get('translator')->trans('are.accepted').".", 2); 
     } 

     $upload = new Upload(); 
     $upload 
      ->setFiletype($file->guessExtension()) 
      ->setEntityName($entity) 
      ->setEntityId($id) 
      ->setUploader($user); 

     $name = basename($file->getClientOriginalName(), '.' . $file->getClientOriginalExtension()); 
     $ext  = $file->guessExtension(); 
     $counter = 1; 

     $newname = "{$name}.{$ext}"; 

     while(file_exists($newname)){ 
      $newname = "{$name}_{$counter}.{$ext}"; 
      $counter++; 
     } 

     $upload->setFilename($newname); 

     $file->move($upload->getFilePath(), $upload->getFilename()); 

     $em->persist($upload); 
     $em->flush(); 


    }catch(Exception $e){ 
     return new Response(json_encode(array('type' => 'error', 'message' => $e->getMessage(),))); 
    } 

    $response['code'] = 'uploaded'; 

    return new Response(json_encode($response)); 
} 

Soweit ich das beurteilen kann, wenn ich versuche, eine xls-Datei zu importieren, die Erweiterung als NULL zurückgibt, anstatt als xls und führt den Exception‘ file.invalid.extension '.

Ich verstehe nicht, warum dies geschieht, weil xls eine der Erweiterungen ist, die im $ valid_ext-Array als gültig definiert sind. Alle anderen Erweiterungen in diesem Array werden ohne Probleme importiert. Ich habe mich in die ritualExtension-Methode und weiter in rateMimeType vertieft, die es verwendet, aber alles scheint gut zu funktionieren.

Wenn ich die Exception'file.invalid.extension 'auskommentiere und versuche, die xls-Datei zu importieren, sagt mir der Fehler, dass die Dateitypspalte nicht NULL sein kann, was mit SQL zu tun hat.

Wenn jemand etwas über diese Art von Problem weiß, lass es mich wissen, danke!

Antwort

0

Für jeden, der sich in der Zukunft damit beschäftigen könnte, habe ich das Problem gefunden. Grundsätzlich ist der xls-Mime-Typ in Symfony veraltet und falsch. guessExtension ruft guessMimeType auf, um den MIME-Typ der importierten Datei zu ermitteln, und ritualExtension verwendet den von guessMimeType zurückgegebenen MIME-Typ, um eine Erweiterung zu erraten. Die rituelleExtension-Methode verweist auf eine Liste von Mime-Typen, um dies zu tun, und das Problem war, dass der xls-Mime-Typ in dieser Liste falsch war, höchstwahrscheinlich nur veraltet. Ich fand den aktuellen xls Mime Typ und ersetzte den in der Liste durch den guten und es hat funktioniert

0

Verwenden Sie getExtension() Methode anstelle von guessExtension(). getExtension() gibt die Erweiterung einer Datei basierend auf ihrem Namen zurück, während die andere Methode die Dateierweiterung basierend auf dem MIME-Typ zurückgibt.

+0

Danke für die Antwort. Ich hätte erwähnen sollen, dass ich getExtension bereits versucht habe und leider die gleichen Ergebnisse erzielt habe. –