七牛上传文件出现 invalid mutilpart format的解决办法

今天用umeditor编辑文章上传图片的时候发现一直卡在”loading…”,打开控制台发现出现了500错误,进一步调试发现是七牛上传报错了。

整个上传流程是

浏览器=》业务服务器=》七牛服务器

在上传方法断点调试发现$_FILES数组正常,所以排除了浏览器到业务服务器上传问题,继续调试

通过查看七牛SDK源码发现在 http.php的第119行附近有这样的代码:

$options = array(

      CURLOPT_USERAGENT => $req->UA,

      CURLOPT_RETURNTRANSFER => true,

      CURLOPT_SSL_VERIFYPEER => false,

      CURLOPT_SSL_VERIFYHOST => false,

      CURLOPT_HEADER => true,

      CURLOPT_NOBODY => false,

      CURLOPT_CUSTOMREQUEST => 'POST',

      CURLOPT_URL => $url['path'],

      CURLOPT_SAFE_UPLOAD => false

);

请注意最后那个

CURLOPT_SAFE_UPLOAD => false
这里应该是跟上传有关的设置,很有可能是这里的问题,果然,GOOGLE发现PHP的CURL上传文件跟PHP版本的关系很大。

传统上,PHP的cURL支持通过在数组数据中,使用“@+文件全路径”的语法附加文件,供cURL读取上传。这与命令行直接调用cURL程序的语法是一致的:

curl_setopt(ch, CURLOPT_POSTFIELDS, array(

    'file' => 
'@'.realpath('image.png'
), 

));

但PHP从5.5开始引入了新的CURLFile类用来指向文件。CURLFile类也可以详细定义MIME类型、文件名等可能出现在multipart/form-data数据中的附加信息。PHP推荐使用CURLFile替代旧的@语法:

curl_setopt(ch, CURLOPT_POSTFIELDS, [

    'file' => new CURLFile(realpath('image.png')), 

]);

PHP 5.5另外引入了CURL_SAFE_UPLOAD选项,可以强制PHP的cURL模块拒绝旧的@语法,仅接受CURLFile式的文件。5.5的默认值为false,5.6的默认值为true。

但是坑的一点在于:@语法在5.5就已经被打了deprecated,在5.6中就直接被删除了(会产生 ErorException: The usage of the @filename API for file uploading is deprecated. Please use the CURLFile class instead)。

对于PHP 5.6+而言,手动设置CURL_SAFE_UPLOAD为false是毫无意义的。根本不是字面意义理解的“设置成false,就能开启旧的unsafe的方式”——旧的方式已经作为废弃语法彻底不存在了。PHP 5.6+ == CURLFile only,不要有任何的幻想。

我的部署环境是5.4(仅@语法)与服务器不同,所以必须写出带有环境判断的代码。

从可靠的角度,推荐指定CURL_SAFE_UPLOAD的值,明确告知php是容忍还是禁止旧的@语法。

注意在低版本PHP中CURLOPT_SAFE_UPLOAD常量本身可能不存在,需要判断:

if (class_exists('\CURLFile')) {

    curl_setopt($ch, CURLOPT_SAFE_UPLOAD, true);

} else {

    if (defined('CURLOPT_SAFE_UPLOAD')) {

        curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false);

    }

}

经过这些设置之后,上传就可以正常了。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索php
, 数组
, 服务器
, 文件
, 浏览器
代码
mutilpartfile、mutilpart、invalid key format、invalid file format、invalid format,以便于您获取更多的相关知识。

时间: 2024-10-22 11:47:27

七牛上传文件出现 invalid mutilpart format的解决办法的相关文章

Nginx走HttpProxy连JBoss在上传文件时的一个bug,及其解决

问题描述: Nginx作为前端HttpServer 使用HttpProxy与JBoss进行连接在上传比较大的文件时,JBoss已经返回结果,但是Nginx不立即将结果返回给浏览器,直到Nginx的HttpProxy与JBoss因为超时而断开后才返回结果给浏览器 这样导致的结果就是用户觉得上传文件需要很长时间. 问题原因分析: Nginx HttpProxy转发的请求是Http 1.0的,就是说是不支持Keep-Alive的,那么也就是说只有当JBoss主动断开与HttpProxy的连接,或是超时

DiscuzX上传文件出现Upload Error: 500的解决方法

这种情况只出现在运行在fcgid模式下的PHP里,MaxRequestLen参数设置值过小导致的.但是原来我也装过,没遇到过这种情况啊?而且我也没设置过MaxRequestLen,按道理他会保持默认值才对. 于是抱着不找到问题原因不罢休的,找了相关的参数资料.于是到了Apache官方站的资料一看,原来从Apache 2.3.6开始,这个参数的默认值从之前的1GB(汗一个)调整到了131072字节(128KB).于是上传128KB以下的文件不会出问题,但是超过这个值就会报500错误了.原来我用的O

求助关于weblogic上传文件,路径问题,及解决方法及思路

问题描述 首先,本地是用tomcat服务器windows开发环境的,没有问题Stringpath=this.getClass().getClassLoader().getClassLoader().getResource("/").getPath();if("\".equals(File.separator)){path=path.substring(1,path.indexOf("/WEB-INF/classes"));path=path.re

UpdatePanel上使用FileUpload上传文件代码

updatepanel上使用fileupload上传文件代码 @page language="c#" masterpagefile="~/evamanager.master" autoeventwireup="true" codefile="hv_excel.asp教程x.cs" inherits="hv_excel" title="untitled page" %> <as

VUE2.0利用VUE-RESOURCE上传文件到七牛

关于上传,总是有很多可以说道的. 16年底,公司项目番茄表单的前端部分,开始了从传统的jquery到vue 2.0的彻底重构.但是上传部分,无论是之前的传统版本,还是Vue新版本,都是在使用着FileAPI这款优秀的开源库,只是进行了简单的directive化.为什么呢?因为兼容性.没办法,公司项目不等同于个人项目,必须要考虑大多数浏览器.否则,上传部分完全可以利用Vue-Resource以及FormData来抛开对FileAPI的依赖.这让我深感遗憾,幸好这个简单的遗憾在个人博客Vue化重构的

uploadify+.ashx上传文件问题。

问题描述 使用uploadify+.ashx上传文件,在本机所有类型的图片都可以上传的.但是发布到服务器上之后,只有.png的文件能上传成功,其他类型的图片文件,上传显示成功但其实并没有上传到服务,连返回值都没有.感觉应该是服务器设置问题但无从下手,代码如下.实在找不到什么原因.<scripttype="text/javascript">$(document).ready(function(){varName=escape('<%=Request["Name

ftp-FTP上传文件的STOR命令一直提示 500 Invalid Path

问题描述 FTP上传文件的STOR命令一直提示 500 Invalid Path 自己写了一个FTP的客户端,前面登录什么的都没问题,只是最后上传的时候STOR命令总是出问题,比如: STOR /home/hello.txt 用Cerberus FTP Server.Quick Easy FTP Server直接返回500 Invalid Path,改成STOR ./hello.txt Cerberus还是提示无效,而Quick easy则可以上传,哪位大神能告诉下STOR这个命令后面到底应该怎

php限制上传文件类型并保存上传文件的方法

 这篇文章主要介绍了php限制上传文件类型并保存上传文件的方法,涉及php针对上传文件的常用操作技巧,非常具有实用价值,需要的朋友可以参考下     本文实例讲述了php限制上传文件类型并保存上传文件的方法.分享给大家供大家参考.具体如下: 下面的代码演示了php中如何获取用户上传的文件,并限制文件类型的一般图片文件,最后保存到服务器 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 3

用菜鸟的眼光浅谈php上传文件

本人由于想写个discuz插件,这个插件功能上涉及到上传文件这一功能,故以菜鸟的眼光来学习了下php上传文件.   首先,w3cshool查了下案例,觉得他说的非常详细,连我这个菜鸟都略懂了一二.   贴上地址:http://www.w3school.com.cn/php/php_file_upload.asp   照着这个讲解,写了下他这个demo,贴上代码:   html:   <form action="demo.php" method="post" e