2017-01-09 18 views
2

ドライブのルートにあるフォルダにユーザーのメールと名前を保持する簡単なテキストファイルをアップロードしようとしました。私は、フォルダを作成し、そのIDを使用してそのフォルダにファイルをアップロードします。JavaScript GoogleドライブAPI V3 - ファイルをフォルダにアップロード

設定ファイルが新しいフォルダに追加されていない限り、すべてうまく動作します。新しいフォルダと一緒にルートに置かれます。

私はこれに関連する多くの質問を見てきて、ほとんどすべての解決策を試しました。この質問は特に(Insert a file to a particular folder using google-drive-api)私の正確な問題のようです。しかし、あなたが見ることができるように、私は彼の変更を実装しましたが、私はまだ同じ問題を抱えています。

以下は、これを行うために呼び出される関数です。

/** 
* Creates the correct directory structure and a config file in the user's drive; 
*/ 
function setupDrive(email, name) { 
    // TODO create CSR folder and config file inside 
    createFolder('CSR'); 
    uploadConfig(email, name); 
    checkAuth(); 
} 

これはcreateFolder()の機能です。

/** 
* Creates a folder with the given name in the drive; 
*/ 
function createFolder(dirName) { 
    var metadata = { 
     'name' : dirName, 
     'mimeType' : 'application/vnd.google-apps.folder' 
    }; 

    var request = gapi.client.request({ 
     'path': '/drive/v3/files', 
     'method': 'POST', 
     'body': JSON.stringify(metadata)}); 
    request.execute(); 
} 

これはuploadConfig()の機能です。

/** 
* Uploads a config file to the CSR folder with the given email and name; 
*/ 
function uploadConfig(email, name) {  
    var request = gapi.client.request({ 
     'path': '/drive/v3/files', 
     'method': 'GET', 
     'q': 'name="CSR", trashed="false", mimeType="application/vnd.google-apps.folder"', 
     'fields': "nextPageToken, files(id, name)" 
    }); 

    request.execute(function (results) { 
     var files = results.files; 
     var csrID = ''; 
     if (files && files.length > 0) { 
      csrID = files[0].id; 
     } 
     uploadFile('config', email + '\n' + name, 'plain', csrID); 
    }); 
} 

最後に、uploadFile()の機能があります。

/** 
* Uploads either a plain text file or a CSV file to the user's Google Drive in the CSR folder; 
*/ 
function uploadFile(fileName, fileContent, mimeType, parentID) { 
    console.log(parentID); //check that a parentID is being passed in 
    var auth_token = gapi.auth.getToken().access_token; 

    var metaType = ''; 
    var bodyType = ''; 
    if (mimeType == 'csv') { 
     metaType = 'application/vnd.google-apps.spreadsheet'; 
     bodyType = 'text/csv\r\n\r\n'; 
    } else if (mimeType == 'plain') { 
     metaType = 'text/plain\r\n\r\n'; 
     bodyType = 'text/plain\r\n\r\n'; 
    } 

    const boundary = '-------314159265358979323846'; 
    const delimiter = "\r\n--" + boundary + "\r\n"; 
    const close_delim = "\r\n--" + boundary + "--"; 

    var metadata = { 
     'name': fileName, 
     'mimeType': metaType, 
     'parents':[{'id': parentID}] 
    }; 

    var multipartRequestBody = 
     delimiter + 'Content-Type: application/json\r\n\r\n' + 
     JSON.stringify(metadata) + 
     delimiter + 'Content-Type: ' + bodyType + 
     fileContent + 
     close_delim; 

    var request = gapi.client.request({ 
     'path': '/upload/drive/v3/files', 
     'method': 'POST', 
     'params': {'uploadType': 'multipart'}, 
     'headers': { 'Content-Type': 'multipart/form-data; boundary="' + boundary + '"', 'Authorization': 'Bearer ' + auth_token, }, 
     'body': multipartRequestBody 
    }) 

    request.execute(function (file) { 
     console.log("Wrote to file " + file.name + " id: " + file.id); 
     }); 
} 

何か助力をいただき、非常に多くのコードをお詫び申し上げます。

編集: 私はREST V2を通してすべてをやったときに動作させることができました。しかし、私はまだ私がV3を使うことを可能にする解決策を見ることに興味があるでしょう。

答えて

0

あなたのコードには、このrelated SO postと比較してエラーはありません。 v2のプロセスはv3と非常に似ていると述べました。 URLのバージョンをv3に、パラメータをv3に変更しました。このthreadにも記載されているように、v3では、もはや親コレクションが存在しません。代わりに、子のIDを持つfiles.getを実行して、親プロパティを取得します。理想的には、fieldsパラメータを使用して、親にのみ応答を制限することができます。このSO answerは、OPがメタデータにparents: ['parentID']を使用した場合にのみ役立ちます。

+0

正しいと正常に動作します。あなたはこの方法で親フィールドを使う必要があります:parents:[folderId]ここのnode.jsの例:https://developers.google.com/drive/v3/web/folder –

0

これはV3

function createFile(){ 
const boundary = '-------314159265358979323846'; 
const delimiter = "\r\n--" + boundary + "\r\n"; 
const close_delim = "\r\n--" + boundary + "--"; 

var fileContent = 'It works :)'; 

var metadata = { 
    'name': 'myFile', 
    'mimeType': 'text/plain\r\n\r\n' 
}; 

var multipartRequestBody = delimiter + 'Content-Type: application/json\r\n\r\n' + JSON.stringify(metadata) + delimiter + 'Content-Type: ' + 'text/plain\r\n\r\n' + fileContent + close_delim; 

gapi.client.request({ 
    'path': '/upload/drive/v3/files', 
    'method': 'POST', 
    'params': { 
     'uploadType': 'multipart' 
    }, 
    'headers': { 
     'Content-Type': 'multipart/related; boundary="' + boundary + '"' 
    }, 
    'body': multipartRequestBody 
}).then(function(response){ 
    console.log(response); 
}); 
} 
+3

あなたのコードが何をしているのか、OPコードとの違いなどを説明します。説明は、単なるコード行よりもずっと役に立ちます:) – Zabuza

関連する問題