Я пытаюсь загрузить видеофайл с эмулятора Android, Genymotion и мобильного устройства в Titanium Appcelerator.
Я получаю успех, когда я загружаю небольшие файлы, захватив с эмулятора около 200-300 КБ, работает нормально. его загрузка и получение ответа от сервера.
Когда я пытаюсь загрузить файл размером 3-5 МБ, я не получаю ответ от сервера.
Иногда я получаю ответ слишком поздно через 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!";
}
Я попробовал родное приложение для Android, чтобы загрузить файл по ссылке: Android-приложение для загрузки файлов на сервер
Работает отлично.
Кто-нибудь может знать, почему ответ занимает слишком много времени? или дайте мне знать, если я что-то забыл.
Я работаю над
Студия Appcelerator, сборка: 4.5.0.201602170821 Titanium SDK 5.2.2.GA Сплав Проект Mac OS X El Capitan Версия 10.11.4
К сожалению, прогресс onsendstream () на Android просто неправильный (слишком быстрый). Я уже сообщал об этом как об ошибке здесь:
https://jira.appcelerator.org/browse/TIMOB-20483
Может быть, вас просто смущает обратный вызов sendstream, и ваш код в порядке?
Других решений пока нет …