android - 使用文件传输上传大于 15mb 的视频时 Phonegap 崩溃

标签 android video upload cordova crash

在 Android、Samsung Galaxy S 上测试,phonegap 版本:1.3.0

我正在为社区构建一个基于用户的视频 uploader 。

所有使用小于 15 mb(大约)的文件的尝试都非常有效, 如果从库中选择文件或录制视频并且 然后上传。

我已经在两个不同的服务器上尝试过这个,并且 php ini 设置很好 高于所要求的。 我尝试过 chunkedMode = false;

问题仍然存在,如果视频大于 15,phonegap 就会崩溃 mb。所有 15 MB 以下的文件都可以正常工作。

Phonegap 甚至不返回错误,它只是崩溃。 我尝试放入 try catch 语句但没有成功。

这是我的代码(非常基本,用于测试目的):

<!DOCTYPE html>
<html>
  <head>
    <title>Video Uploader</title>
    <meta name="viewport" content="width=device-width, initial-
scale=1">
    <link rel="stylesheet" href="master.css" type="text/css" />
    <script type="text/javascript" charset="utf-8"
src="phonegap-1.3.0.js"></script>
    <script type="text/javascript" charset="utf-8">
        function onLoad() {
        document.addEventListener("deviceready",onDeviceReady,false);
    }
        function onDeviceReady() {
                pictureSource=navigator.camera.PictureSourceType;
            destinationType=navigator.camera.DestinationType;
    }
    function uploadFile(mediaFile,method) {
                var ft = new FileTransfer(),
            path = mediaFile,
            name = "video.3gp";
        var options = new FileUploadOptions();
                options.chunkedMode = false;
                        options.fileKey = "file";
                        options.fileName = name;
                        options.mimeType = "video/mpeg";
        ft.upload(path,
            "http://www.myserver.com/upload.php",
            function(r) {
                        alert('Success ' + r.response);
            },
            function(error) {
                        alert('Error ' + path + ': ' + error.code);
            },
            options);
    }
    function onPhotoURISuccess(imageURI) {
                uploadFile(imageURI,"library");
    }
    function getVideo(source, type) {
            navigator.camera.getPicture(onPhotoURISuccess, onFail, { quality:
50, destinationType: destinationType.FILE_URI, sourceType: source,
mediaType: type});
    }
    function onFail(message) {
        alert('Error');
    }
    </script>
  </head>
  <body onload="onLoad()">
        <button class="btn"
onclick="getVideo(pictureSource.PHOTOLIBRARY,Camera.MediaType.VIDEO);">Get
Video</button>
  </body>
</html>

对此的任何建议将不胜感激!

谢谢!

最佳答案

您需要设置

options.chunkedMode=true;

当分块模式为 false 时,Android 上的 HTTP 代码会尝试在发送之前在内存中缓冲整个传输。对于您的情况,较大的传输量为 15 mb,但对于其他手机,它会更少,因为它们的内存更少,这将导致抛出 OutOfMemory 异常。由于 OOME 永远不应该被捕获,因此应用程序将会崩溃。

如果将分块模式设置为 true,则 Android 上的 HTTP 代码会尝试使用流模式将信息发送到服务器。并非所有服务器都支持流模式,但大多数服务器都支持。

至于为什么它在 40+ mb 时失败,我有点不知所措,除非您 php.ini 文件指定这是它可接受的最大文件大小。

关于android - 使用文件传输上传大于 15mb 的视频时 Phonegap 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8940058/

相关文章:

file - 如何使用 cakephp 2.x 上传文件并将其附加到电子邮件?

jQuery:Firefox 不在某些输入 [type=file] 元素上显示文件选择对话框

android - 使用 Loopj Android 异步 Http 客户端将响应与特定请求关联起来

android - 如何在Android服务上实现准确的(精确到秒)计时

android - 使用 javacv 和 ffmpeg 在 Android 中修剪视频长度

batch-file - 在 ffmpeg 中出现错误 'too many inputs specified for the "scale"filter'

ios - 如何以编程方式在 iOS 中实现带音频的屏幕录制?

当大小超过 742 KB 时,PHP 文件上传失败并出现空白屏幕

Android Studio 3.0 RC2 - 多模块项目的 "Default Activity not found"

android - 如何在推送通知(Gcm)android 中显示图像?