gpt4 book ai didi

Appcelerator:如何使用 android 上传视频?

转载 作者:行者123 更新时间:2023-12-02 02:18:46 31 4
gpt4 key购买 nike

我让 iphone/ipad 可以正常使用 Titanium.Media.showCamera() 函数。这很棒。

但是,相同的代码无法像我预期的那样在 android 上运行。所以我做了一些研究并在下面提出了这段代码。代码本身可以上传视频。我可以记录,单击保存,但是当需要上传到我的服务器时,我没有收到任何通信错误,并且在服务器本身上,我在 POST 或 FILES 数组中看不到任何数据。下面的代码在 onclick 按钮上执行。我给出了部分代码,因为除此之外一切正常。给了什么?

button2.addEventListener('click', function() {
// http://developer.android.com/reference/android/provider/MediaStore.html
var intent = Titanium.Android.createIntent({ action: 'android.media.action.VIDEO_CAPTURE' });
Titanium.Android.currentActivity.startActivityForResult(intent, function(e) {
if (e.error) {
Ti.UI.createNotification({
duration: Ti.UI.NOTIFICATION_DURATION_LONG,
message: 'Error: ' + e.error
}).show();
} else {
if (e.resultCode === Titanium.Android.RESULT_OK) {
var dataUri = e.intent.data;

Titanium.Media.saveToPhotoGallery(dataUri);


var xhr = Titanium.Network.createHTTPClient({enableKeepAlive:false});
xhr.open('POST', 'http://someserver.com/upload.php');
xhr.setRequestHeader("enctype", "multipart/form-data");
xhr.setRequestHeader('Cache-Control', 'no-cache');
xhr.onerror = function(e) {
alert(e.error);
};
xhr.onload = function() {
var data = JSON.parse(this.responseText);
if(data.FILE)
alert('File: '+data.FILE);
else
alert(this.responseText);
};

var fileData = Titanium.Filesystem.getFile(dataUri);
var fileContent = fileData.read();
xhr.send({video: fileContent});
} else {
Ti.UI.createNotification({
duration: Ti.UI.NOTIFICATION_DURATION_LONG,
message: 'Canceled/Error? Result code: ' + e.resultCode
}).show();
}
}
});
});

此外,如果您对 php 代码感兴趣,请看这里:

<?php

file_put_contents('output.txt', print_r($_POST, true)."\n".print_r($_FILES, true));

if(empty($_FILES['video']))
die('invalid');

@move_uploaded_file($_FILES['video']['tmp_name'], $_FILES['video']['name']);
echo json_encode(array('FILE' => $_FILES['video']['name']));

最佳答案

好的,明白了。问题是文件是一个 uri,代码不读取文件系统上的 uri。话虽如此,您必须将文件复制到一个新文件,然后使用该新文件上传到服务器。

下面的解决方案对我有用:

button2.addEventListener('click', function() {
// http://developer.android.com/reference/android/provider/MediaStore.html
var intent = Titanium.Android.createIntent({ action: 'android.media.action.VIDEO_CAPTURE' });
Titanium.Android.currentActivity.startActivityForResult(intent, function(e) {
if (e.error) {
Ti.UI.createNotification({
duration: Ti.UI.NOTIFICATION_DURATION_LONG,
message: 'Error: ' + e.error
}).show();
} else {
if (e.resultCode === Titanium.Android.RESULT_OK) {
var dataUri = e.intent.data;




var xhr = Titanium.Network.createHTTPClient({enableKeepAlive:false});
xhr.open('POST', 'http://something.com/video/uploader.php');
xhr.setRequestHeader("enctype", "multipart/form-data");
xhr.setRequestHeader('Cache-Control', 'no-cache');
xhr.onerror = function(e) {
alert(e.error);
};
xhr.onload = function() {
var data = JSON.parse(this.responseText);
if(data.FILE)
alert('File: '+data.FILE);
else
alert(this.responseText);
};

var source = Ti.Filesystem.getFile(dataUri);
var fileData = Ti.Filesystem.getFile('appdata://sample.3gp');
// note: source.exists() will return false, because this is a URI into the MediaStore.
// BUT we can still call "copy" to save the data to an actual file
source.copy(fileData.nativePath);
Titanium.Media.saveToPhotoGallery(fileData);
if(fileData.exists())
{
var fileContent = fileData.read();
if(fileContent)
xhr.send({video: fileContent});
else
alert('Did not get any data back from file content');
}
else
alert('Did not get a file data for : '+dataUri);
} else {
Ti.UI.createNotification({
duration: Ti.UI.NOTIFICATION_DURATION_LONG,
message: 'Canceled/Error? Result code: ' + e.resultCode
}).show();
}
}
});
});

关于Appcelerator:如何使用 android 上传视频?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9262556/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com