【问题标题】:Phonegap crash when using file transfer for uploading video larger than 15mb使用文件传输上传大于 15mb 的视频时,Phonegap 崩溃
【发布时间】:2012-02-14 22:31:44
【问题描述】:

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

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

所有使用小于 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>

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

谢谢!

【问题讨论】:

    标签: android video upload cordova crash


    【解决方案1】:

    你需要设置

    options.chunkedMode=true;
    

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

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

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

    【讨论】:

    • 好的,我明白了我在 chunkedMode 设置上搞错了。非常感谢您的解释!我将尝试进一步提高 php ini 设置,但主要问题已解决 - 应用程序不再崩溃,而是返回错误。非常感谢你 Simon 和 Codemonkey!
    • 好的,你能告诉我如何使用 ajax 将它上传到服务器吗?谢谢
    【解决方案2】:

    您是否尝试过在您的 PHP 脚本上打印出任何调试语句来看看出了什么问题?

    您的客户端代码看起来不错,我使用几乎相同的代码没有任何问题。我已经能够使用 PhoneGap FileTransfer 对象上传大约 40MB 的视频文件。

    另一个选项可能是创建 FileTransfer 的副本作为您的自定义插件。然后,您可以在 Java 代码中设置断点以查看出现了什么问题。

    抱歉,我无法提供更多帮助,因为它对我有用!

    【讨论】:

    • 谢谢回答!我做了更多的测试。如果我设置 chunkedMode=false 或者我不使用 chunkedMode 设置 - 应用程序崩溃。但是,如果我设置 chunkedMode=true 我可以上传 30mb+ 的视频,如果文件太大(我认为大约 40mb)也会出现文件传输错误 3 - 所以应用程序会显示错误并且不会崩溃。奇怪的是,我认为 chunkedMode=false 是为了上传大文件而设置的。
    猜你喜欢
    • 2017-02-26
    • 1970-01-01
    • 1970-01-01
    • 2017-08-09
    • 1970-01-01
    • 2021-07-30
    • 1970-01-01
    • 2019-10-18
    • 2019-04-23
    相关资源
    最近更新 更多