背景
小程序上传图片,调用后台接口,后台接口获得文件后将该文件上传到oss上,最后返回给小程序前端oss图片路径。
发现大多数手机机型上传图片后,后台api是能获取到文件的,但是荣耀手机却获取不到小程序上传的图片file信息。
有时上传一些高清照片文件时,后台也接受不到文件,而且上述现象是偶发现象,所以很郁闷。
分析
偶发现象,所以毫无头绪,一次偶然,后台api打印了一次$_FILE全局变量,如下
array:1 [
"file" => array:5 [
"name" => "159667884882222.jpeg"
"type" => ""
"tmp_name" => ""
"error" => 1
"size" => 0
]
]
发现error为1,经查阅资料,$_FILES['file']['error']有以下几种值
值为0,表示UPLOAD_ERR_OK,没有错误发生,文件上传成功。
值为1,表示UPLOAD_ERR_INI_SIZE,上传的文件超过了 php.ini 中 upload_max_filesize选项限制的值。
值为2,表示 UPLOAD_ERR_FORM_SIZE,上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。
值为3,表示UPLOAD_ERR_PARTIAL,文件只有部分被上传。
值为4,表示UPLOAD_ERR_NO_FILE,没有文件被上传。
值为6, 表示UPLOAD_ERR_NO_TMP_DIR,找不到临时文件夹。PHP 4.3.10 和 PHP 5.0.3 引进。
值为7,表示UPLOAD_ERR_CANT_WRITE,文件写入失败。PHP 5.1.0 引进。
现在恍然大悟,原来我们上传文件大小超过了php.ini参数的upload_max_filesize最大限制。
解决
小程序不调用上传图片api(小程序端),而是调用获取图片信息api,将获取的图片转换成base64,将该base64做为参数调用后台post接口,后台接口获取到该参数之后转换为图片,然后上传到oss,最后将oss路径返回给前端
小程序上传图片不调用后台api,直接小程序端调用oss上传图片,oss路径直接返回给前端。这样减少了和后台的交互。小程序上传图片至oss
修改php.ini文件中关于上传文件大小的参数。首先我们查看下php.ini文件默认的upload_max_filesize参数值为2M。
其实在php.ini中影响上传文件大小的参数不只upload_max_filesize,影响参数有:
配置项
默认值
功能描述
file_uploads
ON
确定服务器上的PHP脚本是否可以接受HTTP文件上传
memory_limit
8M
设置脚本可以分配的最大内存量,防止失控的脚本独占服务器内存
upload_max_filesize
2M
限制PHP处理上传文件的最大值,此值必须小于post_max_size值
post_max_size
8M
限制通过POST方法可以接受的信息最大量
可以看出在调大upload_max_filesize值的同时也的调大post_max_size的值。
最后一步就是修改我们的php.ini文件,也是最重要的一步。
首先我们需要找到php.ini的位置,方法有俩个
执行命令
[root@ ~] php -i | grep php.ini
Configuration File (php.ini) Path => /usr/local/etc/php
在phpinfo()页面中搜索php.ini,会找到php.ini的位置,如下
image.png
在php7中,到/usr/local/etc/php目录下,我们发现并没有php.ini这个文件。有一个php.ini-development文件和php.ini-production文件。
此时我们将php.ini-production文件copy为php.ini,修改完参数后,重启php服务即可
最后在执行命令,将看到多出来一条Loaded Configuration File,则显示php.ini加载成功。
[root@ ~] php -i | grep php.ini
Configuration File (php.ini) Path => /usr/local/etc/php
Loaded Configuration File => /usr/local/etc/php/php.ini