当我通过 POST 发送大于 20MB 的视频文件时,为啥 json 响应为 NULL?
Posted
技术标签:
【中文标题】当我通过 POST 发送大于 20MB 的视频文件时,为啥 json 响应为 NULL?【英文标题】:Why is json response NULL when I send video file larger than 20MB via POST?当我通过 POST 发送大于 20MB 的视频文件时,为什么 json 响应为 NULL? 【发布时间】:2013-07-27 20:14:46 【问题描述】:我正在创建一个 POST 请求并使用它向服务器发送视频。在服务器端,我对视频进行解码,并将其保存到文件目录中。如果发送的视频小于 20MB,一切都按预期工作,并且我得到一个有效的 JSON 响应,否则我的响应字典为 NULL 或返回“操作无法完成。(Cocoa 错误 3840。)”
$result = mysqli insert statement;
$videoDirectory = 'userVideos/'.$unique_id.'.mp4';
$decodedVideo =base64_decode($video);
file_put_contents($videoDirectory, $decodedVideo);
if (!$result['error'])
$e = "register into Str33trider successfully";
print json_encode(array('results'=>$videoCaption));
exit();
我什至编辑了我的 apache 配置文件
<IfModule mod_php5.c>
php_value post_max_size 200M
php_value upload_max_filesize 200M
php_value memory_limit 320M
php_value max_file_uploads 200M
php_value max_execution_time 30000
php_value max_input_time 259200
php_value session.gc_maxlifetime 1200
</IfModule>
【问题讨论】:
看起来你已经改变了 .htaccess 设置,那么 php.ini 中的设置会不会让你丧命? 通过phpinfo检查我的设置说upload_max_filesize 200M。 php.ini 中还有什么我应该寻找的吗? 我怀疑对于较大的视频,base64_decode 的时间太长,但我不确定:( 这和ios有什么关系? “json 响应为 NULL”是什么意思?您的意思是 HTTP POST 请求中的正文数据是空的吗? 请求的json响应中的字典为NULL,或者我得到以下响应:操作无法完成。 (可可错误 3840。) 【参考方案1】:当您收到 POST 请求的响应时,首先检查状态代码。
如果 POST 请求成功:
如果状态码等于 200(正常)或 204(无内容),则响应正文可能为空,或者它描述了操作的结果。使用任一状态代码,请求都没有创建可以通过 URI 标识的资源。
如果状态码等于 201(已创建),则请求在服务器上创建了一个资源,并且响应正文可以描述操作的结果,并且响应应该包含一个可以定位新资源的位置标头。
通常,Web 服务 API 描述有关响应正文(如果有)及其内容类型和字符编码的详细信息。可能有不止一种格式可以发送,例如JSON 或 XML。
如果 POST 请求失败:
服务器将发送相应的状态代码和可选的响应正文,其中包含有关错误的详细信息。通常,服务器可能会以与请求的 Accept 标头不匹配的内容类型发送响应正文。
注意:
客户端还应始终检查响应正文的内容类型(如果有)并相应地对其进行解码。在服务器错误的情况下,内容类型通常可能是 text/html 而不是 Accept 标头中指定的内容类型,例如应用程序/json。
因此,如果您记录 Cocoa 错误 3840 的完整错误描述,您将看到给定文本可能不是 JSON,因为它必须以“[”或“”开头。这表明,您从不是 JSON 的服务器收到错误消息。对错误消息进行解码,使其易于阅读,并将其记录到控制台以查看服务器告诉您的内容。
【讨论】:
OK,AFJSONREquestOperation 失败了,但是操作状态码还是200,不知道为什么会失败。谢谢 我会试着找出发生了什么。 如果我将此行注释掉,我总是会得到一个有效的响应 file_put_contents($videoDirectory, $decodedVideo); AFJSONRequestOperation 期望 JSON 作为响应。因此,当您的反应对您的期望有些“漠不关心”时,它就不太合适了。您的 Web 服务行为也可能不正确。使用较低级别的 AFNetworking 类或直接使用 NSURLConnection 实现您的 POST 请求,并根据响应的 Content-Type 解码响应。以上是关于当我通过 POST 发送大于 20MB 的视频文件时,为啥 json 响应为 NULL?的主要内容,如果未能解决你的问题,请参考以下文章
未通过 AJAX POST 请求发送大尺寸图像的 base64(作为 FormData 参数)