当我通过 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?的主要内容,如果未能解决你的问题,请参考以下文章

无法从解析服务器下载大于 20mb 的 pdf 文件

未通过 AJAX POST 请求发送大尺寸图像的 base64(作为 FormData 参数)

Python:使用cherrypy通过POST发送和接收大文件

通过 WCF 休息服务发送大文件 (>10 MB)

在 Flex 中上传大于 100MB 的文件

是否可以使用我的机器人在 discord.py 中附加大于 150Mb 的文件