php 上传文件写入失败,客户端上传文件失败

背景

小程序上传图片,调用后台接口,后台接口获得文件后将该文件上传到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。

1ffd4a09a6a4

其实在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的位置,如下

1ffd4a09a6a4

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值