一个上传图片项目遇到的一些问题

接到个项目,大致是制作一个微信上访问的H5,需要存下用户提交的文字与照片。

前端同事写了个demo,我先在本地搭环境进行测试。

随便拿了几张几百k的图片测试,用了我利用空余时间自己写的简单api模板和文件上传类,十几分钟搞定本地代码。直接上测试服务器。

在测试服务器测试过程中遇到了一系列问题。

  1. 题:调试过程中,在多次使用file_put_contents输出错误却看不到相应返回。

    答:咨询了管理员才了解。原来测试服务器的FTP是有主从的,约10分钟同步一次。

    解:由于此测试服不在我们的管理范围内,只好谨慎的上传。毕竟不巧的话,上传后可能要19分钟才能看到结果。

  2. 题:测试服务器对应的数据库在执行insert和update语句时能够成功运行,而执行select语句时,会报出“1146表不存在”的错误。

    答:经过Google查询初步了解情况,推测数据库也是主从架构,然后向数据库管理员进行确认。得知数据库也是主从的架构,10分钟同步一次,但是可能配置出了点问题,主库的表在创建后没有同步到从库里。insert和update语句是直接运行在主库里,所以没有问题,而select语句读的是从库,从而导致1146错误。

    解:我们也没有数据库的管理权限,只好等数据库管理员修复。

  3. 题:所使用的文件上传类是用move_uploaded_file来存储上传的文件。通过获取结果,该函数返回了true,之后的方法也成功运行了文件名及路径也存入了数据库,但是图片却没有在FTP上找到。

    答:经过获取服务器端ip以及使用gethostbynamegethostname等函数获取所请求的服务器在内网的地址等信息。经过分析判断以及向管理员求证,由于FTP服务是不定时切换的,若外网访问的是从服务器,则图片会被存在从服务器里。但是主从同步只会由主向从同步,而不会逆向进行。

    解:正式站不是主从的设计,直接写了个demo上正式站进行测试,经测问题无法重现,则略过了该问题。

  4. 题:我方流程测试完成,将地址发给了几位同事进行测试时,发生了有时候图片上传了,却没有存下图,数据库里也没存入图片信息的问题。

    答:经过多次重现,定位到是在单个图片过大的时候,才会发生问题。通过file_put_contents输出$_FILES,得知当单个图片大于3M时,$_FILES会变成空数组。

    解:经过查询手册,更改了php.ini中几个参数,重启后问题得到解决。

对上文中提到的一些函数及配置进行说明

  1. file_put_contents($filename,$data,$flag)

    对线上文件进行调试的不二利器,配合var_export($expression,true)能够将数组或对象转化为字符串,便于写入log。

    eg.file_put_contents(‘fl.log‘,var_export($_FILES,true)."\r\n",FILE_APPEND);

  2. move_uploaded_file($filename,$destination)

    一般文件上传类用到的根本都是这个方法,将tmp_name存入给予的文件路径下。注意$destination必须是绝对路径。

    eg.move_uploaded_file($tmp_name, LOCAL_ROOT.$save_path);

  3. gethostbyname($hostname)

    将给予的hostname转换为IPv4地址

    eg.gethostbyname(‘cn.bing.com‘); //202.89.233.103

  4. gethostname()

    此函数会返回当前机器的hostname,对于windows系统的计算机来说也就是“计算机名”。

  5. php.ini 中 post_max_size 配置项

    设置单次post数据的最大值,上传大文件时,该值必须大于upload_max_filesize。通常memory_limit必须大于post_max_size

    eg.post_max_size = 20M

  6. php.ini 中 upload_max_filesize 配置项

    设置上传单个文件的最大值,

    eg.upload_max_filesize = 64M

  7. get_cfg_var($option)

    能够获取PHP配置项值的函数,在服务器不在我方管辖范围内的情况,且不便于过多打扰管理员时,特别管用。

    eg.get_cfg_var(‘upload_max_filesize‘); //64M

总结

  1. 需要用到的服务器是否特殊的架构之类要提前咨询清楚,知己知彼能够省下很多时间。
  2. 在本地测试时一定要测试极限情况,假如我在本地测试时,用一个10M的图测一下,也能少很多事情。
  3. 一拿到任何服务器时,最好能先看一下phpinfo,了解php版本等情况。假如项目里有需要上传等操作,也可以用get_cfg_var先看一下所配置大小够不够。
时间: 2024-10-31 14:43:47

一个上传图片项目遇到的一些问题的相关文章

Cocos2dx 3.0开发环境搭建--Eclipse上构建一个Android项目

一.前言: 本篇主要介绍Cocos2d-x 3.0的一些基础内容,以及在Eclipse上上编译我们的Cocos2d-x项目,成功把Helloworld运行起来了.看完本篇博客之后,你就会知道Cocos2d-x 3.0竟然发生了如此大的变化,变得如此简单,环境搭建.项目创建.编译的方式更加人性化了. 二.环境准备: 1.下载ADT Bundle(Eclipse捆绑了SDK和ADT),或者是Eclipse安装了ADT插件. 2.安装JDK.NDK.Ant .Python,然后配置环境. 3.Coco

创建一个android项目与创建一个android虚拟设备

创建一个android项目 Navigator面板区点击右键-->New-->Android Application Project,打开New Android Applicaton窗口.输入Application Name(应用程序的名称,就是显示在手机上的名称,比如:微信),Project Name(项目名称,一般显示在eclipse上的项目名称),Package Name(指定它的java包名,比如:com.qq.weixin).Minimum Required SDK表示运行应用程序所

windows系统下跨平台开发环境的搭建(cordova)+创建一个android项目

目的:在windows系统下,搭建跨平台的开发环境(cordova)创建一个安卓项目 前提:安装有java Jdk 1.8以上 Android SDK 23以上 1.安装node.js ,选择对应的版本下载安装,没什么好说的 官方网址:http://nodejs.cn/ 2.测试安装是否成功 win+r 键,打开运行窗口,输入cmd,然后确定,打开命令行窗口 输入node  -v 输出版本号,说明node.js安装成功,否则请查找原因,或者重新安装 输入npm -v 输出版本号说明npm可以使用

[Android Studio 权威教程]离线配置SDK,创建第一个AS项目

前三篇bolg我给大家分享了怎么安装Android Studio,但是我们还没有使用AS创建一个Android 的项目,那么这篇blog我们开始离线配置SDK,并且创建一个Android项目 没有看如何安装Android Studio的童鞋,请先看这里,然后回来我们继续: [Android Studio 权威教程]Mac下安装Android Studio [Android Studio 权威教程]Linux下安装Android Studio [Android Studio 权威教程]Window

Android基础之用Eclipse搭建Android开发环境和创建第一个Android项目(Windows平台)

一.搭建Android开发环境 准备工作:下载Eclipse.JDK.Android SDK.ADT插件 下载地址:Eclipse:http://www.eclipse.org/downloads/ JDK:http://www.oracle.com/technetwork/java/javase/downloads/jdk7u9-downloads-1859576.html Android SDK:http://developer.android.com/sdk/index.html ADT:

eclipes创建一个web项目web.xml不能自动更新的原因(web.xml和@WebServlet的作用)

在eclipse中创建一个Web项目的时候,虽然有web.xml生成,但是再添加Servlet类文件的时候总是看不见web.xml的更新,所以异常的郁闷!上网查了查,原来我们在创建Web项目的时候,会弹出一个对话框,“Dynamic web module version”这个选项默认成了3.0,按照老规范,应该是在eclipse的WebContent \ WEB-INF \ 目录下创建web.xml的.而新规范是可以不用web.xml的,如tomcat 7.0就支持新规范,这样相关的servle

【读书札记】建立第一个Web项目

安装配置好jdk,tomcat,我用的版本是7.0.54,我放在C:\server\apache-tomcat-7.0.54下, CATALINA_BASE:C:\server\apache-tomcat-7.0.54 CATALINA_HOME:C:\server\apache-tomcat-7.0.54 也可以在Path下面添加配置  ;C:\server\apache-tomcat-7.0.54\bin ,这样就可以在cmd下直接输入startup启动服务器了. 背景:运用web容器tom

对一个“失败”项目的审视—前言

总说自己牛B的人-狂妄自大 总笑自己傻B的人-妄自菲薄. 我相信任何一位牛B的人都曾做过傻B的事, 所以得出的结论是:一位牛人的诞生,是由N多傻B的人.傻B的事所磨练出来的. 我并非牛人,却已经做过很多傻B的项目.有的项目初期设计非常牛B,但是随着时间的推移.人员的更迭.预算的缩水,到头来变成了一款鸡肋的产品--食之无味弃之可惜. 以下几篇文章,我会从架构设计.实际编码.人员管理等诸多方面来分析一款我设想得很牛B,最后却做得很傻B的项目.当然,我这里所谓"傻B",指的是一种主观上的失败

《android 1: 创建一个安卓项目》

创建方式有两种: 通过Eclipse创建 在工具栏上选择New>android>android application project,或者在导航栏上选择file>new>project>android>android application project. 在出现的窗口上填上与选择你的 Application Name .Project Name.Package Name.Minimum Required SDK.Target SDK.Compile With.Th