2012-02-13 85 views
3

我得到iPhone/iPad的Titanium.Media.showCamera()函數正常工作。這很棒。Appcelerator:如何使用android上傳視頻?

但是,相同的代碼不能像我所期望的那樣在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'])); 
+0

我找到了解決辦法。基本上你只需要將uri文件複製到現有的文件。我會在當天晚些時候爲其他具有相同問題的人發佈解決方案。 – user1207047 2012-02-13 17:04:41

回答

2

好了它。問題是該文件是一個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(); 
      } 
     } 
    }); 
}); 
+0

如果大型視頻文件鈦(3.5.1)崩潰TiRemoteApp(213,0x2da3000)malloc:*** mach_vm_map(size = 312246272)失敗(錯誤代碼= 3) [信息]:***錯誤:can' t分配區域 [INFO]:***在malloc_error_break中設置一個斷點來調試 – JRC 2015-04-25 08:40:43