使用laravel的文件上传功能,上传ai文件却被转存为pdf文件,不希望被转存为pdf。

业务背景

使用laravel文件上传功能,上传各种格式文件,目前pdf,pptx,png,jpg,xlsx等多种文件格式上传后,返回的文件格式和扩展名都是正确的。

问题

唯独后缀.ai文件(Adobe illustrator),使用了laravel的文件上传功能store()方法后,文件是成功上传了但却被转存为了pdf格式,这是我不想要的,希望以ai格式上传,服务端也能以ai格式存储。

复现问题

使用laravel的文件上传功能,上传ai文件却被转存为pdf文件,不希望被转存为pdf。

请留意我使用postman上传了一个名称为1.ai的文件,上传成功后,返回的list数组中的文件链接变成了pdf格式。

上传后ai文件被转存为pdf文件

使用laravel的文件上传功能,上传ai文件却被转存为pdf文件,不希望被转存为pdf。

服务端代码

使用laravel的文件上传功能,上传ai文件却被转存为pdf文件,不希望被转存为pdf。

代码103行,使用laravel的store()方法进行文件上传

个人猜测

使用laravel的文件上传功能,上传ai文件却被转存为pdf文件,不希望被转存为pdf。

使用laravel的文件上传功能,上传ai文件却被转存为pdf文件,不希望被转存为pdf。

请留意86行我打印了上传文件的扩展名,但它返回的并不是ai而是pdf,我顺着程序一步步点进底层代码的封装,发现底层代码中在获取文件mimeType时就已经获取的是pdf格式了,所以转存时就转存了pdf。

而一直困扰着我的是,我无法弄清楚为什么ai格式的文件,底层封装的代码获取到的mimeType会是’application/pdf’

底层代码分析

使用laravel的文件上传功能,上传ai文件却被转存为pdf文件,不希望被转存为pdf。

MimeTypes文件路径:项目/vendor/symfony/mime/MimeTypes.php

请注意代码的135行,我上传了ai文件后,获取的mimeType却是
application/pdf(请看下方debug处$mimeType变量),应该是application/postscript才对。

结论:个人猜测,上传ai文件被程序识别成了application/pdf文件,并转存为了pdf文件,这是我不想要的,所以求助大家,希望大家帮我看看,谢谢了。

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 1

file

  • 调用 store 方法来进行存储文件最后都会使用这个类来确认文件 mime 类型 php.net/manual/en/function.finfo-f...
  • finfo_file() 依赖实际字节内容来判断 mime 类型,你的 1.ai 文件是由 pdf 文件直接改后缀名得到的,并没有进行实际意义上的字节更改,因此判定为 pdf 类型
  • 所以是上传的文件有问题,而不是 Laravel 有问题

你可以使用 storeAs 来进行强制一致性存储

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!