php - 无法将大于 500kb 的视频文件大小上传到 Android 中的 Linux 服务器

标签 php android file-upload titanium appcelerator

我正在尝试从 Titanium Appcelerator 中的 Android 模拟器、Genymotion 和移动设备上传视频文件。

当我上传从模拟器捕获的大约 200-300kb 的小文件工作正常时,我获得了成功。它正在上传并从服务器获得响应。

当我尝试上传大约 3-5MB 的文件时,我没有收到服务器的响应。 有时我在 2-4 分钟后收到回复太晚了,当时文件已上传。但经常它没有上传并且不再得到响应。

我尝试了网上发布的不同代码,但没有 100% 成功。

在数据流的日志中,我可以看到进程 0-1,但对于大文件,它停止在 .9999x,它没有到达 1。

[INFO] :   ONSENDSTREAM - PROGRESS: 0.9998882582315288 
[INFO] :   ONSENDSTREAM - PROGRESS: 0.9999253846335128 
[INFO] :   ONSENDSTREAM - PROGRESS: 0.9999625110354967 
[INFO] :   ONSENDSTREAM - PROGRESS: 0.9999996374374807

这是我用于测试的示例代码。

钛按钮点击

var intent = Titanium.Android.createIntent({
    action : Ti.Android.ACTION_PICK,
    type : "video/*"
});

intent.addCategory(Ti.Android.CATEGORY_DEFAULT);

$.index.activity.startActivityForResult(intent, function(ei) {
    if (ei.error) {
        alert("Error");
    } else {
        var dataUri = ei.intent.data;

        var xhr = Titanium.Network.createHTTPClient(/*{enableKeepAlive:false}*/);
        xhr.setTimeout(1000 * 60 * 5);
        xhr.open('POST', 'http://gaurangchhatbar.in/ws/apitest/videouploadcode.php');
        xhr.setRequestHeader("enctype", "multipart/form-data");
        xhr.setRequestHeader('Cache-Control', 'no-cache');
        xhr.onerror = function(ex) {
            alert(ex.error);
        };
        xhr.onload = function() {
            alert(this.responseText);
        };
        xhr.onsendstream = function(ex) {
            Ti.API.info('ONSENDSTREAM - PROGRESS: ' + ex.progress);
        };
        var filename = "UploadedFile-" + (new Date()).toString();
        filename = filename.replace(/\./g,"-");
        filename = filename.replace(/\:/g,"-") + ".mp4";
        Ti.API.info(filename);
        var source = Ti.Filesystem.getFile(dataUri);
        var fileData = Ti.Filesystem.getFile(Ti.Filesystem.getApplicationDataDirectory(), filename);

        source.copy(fileData.nativePath);
        if (fileData.exists()) {
            var fileContent = fileData.read();
            if (fileContent)
                xhr.send({
                    video_path : fileContent,
                    action : "uploadvideo"
                });
            else
                alert('Did not get any data back from file content');
        } else
            alert('Did not get a file data for : ' + dataUri);
    }
});

PHP 代码

$target_path = "video/";
$target_path = $target_path . basename( $_FILES['video_path']['name']);

if(move_uploaded_file($_FILES['video_path']['tmp_name'], $target_path)) {
    return "success";
} else{
    return "falied!";
}

我尝试使用 native android 应用程序从链接上传文件:Android Native App for Upload File to Server

效果很好。

谁能知道为什么响应时间太长?如果我忘记了什么,请告诉我。

我正在努力

Appcelerator Studio, build: 4.5.0.201602170821
Titanium SDK 5.2.2.GA
Alloy Project
Mac OS X El Capitan
Version 10.11.4

最佳答案

可悲的是,android 上的 onsendstream() 进度是错误的(太快了)。我已经在此处将其报告为错误:

https://jira.appcelerator.org/browse/TIMOB-20483

会不会是你只是被sendstream回调搞糊涂了,你的代码没问题?

关于php - 无法将大于 500kb 的视频文件大小上传到 Android 中的 Linux 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37229415/

相关文章:

php - Bootstrap 下拉导航仅适用于动态导航中的当前页面

javascript - 可通过 Ajax 下载 CSV 文件

php - 具有相同列名的 MYSQL 表

php - 将三个表连接在一起 SQL PHP

android - 如何以编程方式在自定义标题栏上设置背景颜色渐变?

angular - 如何在angular4中上传同一个文件

java - 单元测试从另一个类调用的方法

android - "in-app billing version 3 NOT supported"与最新的 Play 商店

php - 上传从同一服务器下载的视频时不生成缩略图

jsf - <p :fileUpload> recreates @ViewScoped bean on every request