cordova - YouTube 上传 API 和 cordova/phonegap

标签 cordova meteor youtube-api youtube-javascript-api

我正在编写一个 cordova 应用程序,让用户录制视频并通过 API 将其上传到 YouTube。

如果我使用文件输入并通过访问文件

$('#file').get(0).files[0]

我收到一个 file 对象,可以毫无问题地上传。

如果我录制视频,我会收到一个媒体列表对象。 然后我可以调用 window.resolveLocalFileSystemURL( video[0].localURL , success, failed);

在成功回调中,我收到一个文件列表对象。这也不会被接受。

在这个filelist对象上,我可以调用data.file(success,fail),它最终返回一个文件对象。但是当尝试上传到 YouTube 时,我收到了 308 错误。

我怀疑这与访问本地文件路径的权限有关。如果有人有这方面的经验,我很想听听解决方法。

这是上传代码:

UploadVideo.prototype.ready = function(accessToken, video) {
    this.accessToken = accessToken;
    this.gapi = gapi;
    this.authenticated = true;
    $this = this;

function result(data){
    function success(data){

        data.name = "VID_20150329_160037.mp4";
        console.log(data)
        $this.uploadFile( data );
    }
    data.file(success)

}
function fail(data){
    console.log(data)
}
window.resolveLocalFileSystemURL( video[0].localURL , result, fail);


//this.uploadFile( $('#file').get(0).files[0] );

// $('#button').on("click", this.handleUploadClicked.bind(this));

最佳答案

使用这篇博文,我成功地使元数据和文件上传正常工作: http://lithostech.com/2013/10/upload-google-youtube-api-v3-cors/

通过在发送之前注销 FileTransfer header 信息,我可以看到格式不同:

Content-Disposition: form-data; name="part"
{"snippet":{"title":"Video title","description":"Video description","tags":"Video tags","categoryId":22},"status":{"privacyStatus":"unlisted"}}

应该是:

Content-Disposition: form-data; name=""; filename="file.json"
Content-Type: application/json
{"snippet":{"title":"Video title","description":"Video description","tags":"Video tags","categoryId":22},"status":{"privacyStatus":"unlisted"}}

这是包含工作元数据的更新版本:

function uploadVideo(fileURL) {
    var options = new FileUploadOptions();
    options.fileKey = 'file';
    options.fileName = fileURL.substr(fileURL.lastIndexOf('/') + 1);
    options.mimeType = 'video/mpg';
    options.chunkedMode = false;
    options.headers = {
        Authorization: 'Bearer ' + accessToken
    };
    options.params = {
        "": {
            snippet: {
                title: 'Video title',
                description: 'Video description',
                tags: 'Video tags',
                categoryId: 22
            },
            status: {
                privacyStatus: 'unlisted'
            }
        }
    };
    var ft = new FileTransfer();
    ft.upload(fileURL, 'https://www.googleapis.com/upload/youtube/v3/videos?part=snippet,status', function (data) {
        console.log('upload success', data);
    }, function (e) {
        console.log('upload error', e);
    }, options, true);
    ft.onprogress = function (progressEvent) {
        console.log('onprogress: ' + ((progressEvent.loaded / progressEvent.total) * 100) + '%');
    };
}

请注意,我也稍微修改了我的 FileTransfer 插件:

文件传输.java 第 374 - 376 行

beforeData.append("Content-Disposition: form-data; name=\"").append(key.toString()).append("\";");
beforeData.append(" filename=\"").append("file.json").append('"').append(LINE_END);
beforeData.append("Content-Type: ").append("application/json").append(LINE_END).append(LINE_END);

修改 cordova/phonegap/ionic 中的插件后,您需要重新加载它。我通过删除平台并再次添加来做到这一点:

cordova platform remove android; cordova platform add android;

关于cordova - YouTube 上传 API 和 cordova/phonegap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29330360/

相关文章:

android - PhoneGap互操作

javascript - 从数组获取列表中项目的索引

带电容的ios webview,设置安全区域

javascript - 在 Meteor 中附加 base64 PDF 作为电子邮件附件

javascript - YouTube上载小部件无法设置隐私

android - Cordova运行错误-找不到安装的生成工具。安装Android构建工具版本19.1.0或更高版本

javascript - 将服务器的回调集成到 Meteor/Node 方法中

javascript - 在 Meteor [1.0.0] 中写入服务器上的文件(每次构建都不会丢失文件)

php - Youtube API PHP Zend GData 直接上传

c# - YouTube API - 从用户限制获取所有视频?