在Android、三星Galaxy S、phonegap版本上测试:1.3.0
我正在为一个社区构建一个基于用户的视频上传器。
所有使用小于15mb(大致)的文件的尝试都像一个符咒,如果从库中拾取文件或录制视频然后上传。
我已经在两个不同的服务器上尝试过了,它们的php.ini设置都很好高于要求。我尝试过chunkedMode=false;
问题仍然存在,如果视频大于15,则phonegap会崩溃兆字节所有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永远不会被捕获,因此应用程序将崩溃。
如果你将chunked模式设置为true,那么Android上的HTTP代码会尝试使用流模式将信息发送到服务器。并非所有服务器都支持流媒体模式,但大多数服务器都支持。
至于为什么它在40MB以上失败,我有点不知所措,除非php.ini文件指定这是它可以接受的最大文件大小。
您是否尝试在PHP脚本上打印任何调试语句,只是为了看看出了什么问题?
您的客户端代码看起来不错,我使用的代码几乎完全相同,没有任何问题。我已经能够用PhoneGap FileTransfer对象上传大约40MB的视频文件。
另一种选择可能是创建一个FileTransfer副本作为您的自定义插件。然后,您可以在Java代码中设置一个断点来查看出现了什么问题。
对不起,我不能再帮你了,因为这对我很有用!