【问题标题】:Unable to import .xls - Symfony PHP无法导入 .xls - Symfony PHP
【发布时间】:2016-04-05 16:04:54
【问题描述】:

我是一名新开发人员,在一家网站公司工作。我们在导入 excel 文件时遇到了一个错误,它不接受 xls 作为有效的扩展名,但可以接受 xlsx 和其他文件。这是给出错误的方法。

公共函数 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) );
}

据我所知,当我尝试导入 xls 文件时,它会将扩展名返回为 NULL 而不是 xls,并抛出异常'file.invalid.extension'。

我不明白为什么会这样,因为 xls 是在 $valid_ext 数组中定义为有效的扩展之一。该数组中的所有其他扩展都可以毫无问题地导入。我深入研究了guessExtension 方法,并进一步研究了它使用的guessMimeType,但这些方法似乎一切正常。

当我注释掉 Exception'file.invalid.extension' 并尝试导入 xls 文件时,我得到的错误告诉我文件类型列不能为 NULL,这与 SQL 有关。

如果有人知道此类问题,请告诉我,谢谢!

【问题讨论】:

    标签: php excel symfony import xls


    【解决方案1】:

    使用getExtension() 方法而不是guessExtension()getExtension() 根据文件名返回文件扩展名,而另一种方法根据 mime 类型返回文件扩展名。

    【讨论】:

    • 感谢您的回复。我应该提到我已经尝试过 getExtension 并且不幸地得到了相同的结果。
    【解决方案2】:

    对于将来可能会看到此问题的任何人,我发现了问题。基本上 Symfony 中的 xls mime 类型已经过时并且是错误的。 guessExtension 调用guessMimeType 来判断导入文件的mime 类型,然后guessExtension 使用guessMimeType 返回的mime 类型来猜测扩展名。 guessExtension 方法引用了一个 mime 类型列表来执行此操作,问题是该列表中的 xls mime 类型是错误的,很可能只是过时了。我找到了当前的 xls mime 类型并将列表中的那个替换为好的那个,它工作了

    【讨论】:

    • 你提到你找到了正确的 mime 类型,那是哪一种?
    猜你喜欢
    • 2018-04-13
    • 2013-03-14
    • 2013-04-11
    • 2017-12-31
    • 2014-01-14
    • 2012-07-11
    • 1970-01-01
    • 2018-12-22
    • 1970-01-01
    相关资源
    最近更新 更多