2016-04-05 35 views
0

我是一位在網站上的公司工作的新開發人員。我們有一個導入excel文件的錯誤,它不接受xls作爲有效的擴展,但是xlsx和其他文件被接受。這是給出錯誤的方法。無法導入.xls - Symfony PHP

公共職能orderAddUpload(請求$要求){

/* 
    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)); 
} 

據我所知道的,當我嘗試導入xls文件返回擴展爲NULL,而不是爲XLS和拋出的異常」 file.invalid.extension」。

我不明白爲什麼會發生這種情況,因爲xls是在$ valid_ext數組中定義爲有效的exentions之一。該數組中的所有其他擴展都可以毫無問題地導入。我挖掘出guessExtension方法,並進一步在guessMimeType中使用它,但是在這些方面似乎一切正常。

當我註釋掉Exception'file.invalid.extension'並嘗試導入xls文件時,我得到的錯誤告訴我文件類型列不能爲NULL,與SQL有關。

如果有人知道這種類型的問題,請讓我知道,謝謝!

回答

0

對於任何人在將來可能會看到這一點,我發現了這個問題。基本上,Symfony中的xls mime類型已經過時並且是錯誤的。 guessExtension調用guessMimeType來確定導入文件的MIME類型,然後guessExtension使用guessMimeType返回的MIME類型來猜測擴展名。 guessExtension方法引用了一個MIME類型列表來執行此操作,問題在於該列表中的xls mime類型是錯誤的,最有可能只是過時。我發現了當前的xls mime類型,並用好的替換了列表中的那個,它的工作原理如下

0

使用getExtension()方法而不是guessExtension()getExtension()根據名稱返回文件的擴展名,而另一種方法返回基於MIME類型的文件擴展名。

+0

感謝您的回覆。我應該提到我已經嘗試過getExtension,並且不幸得到了相同的結果。 –