How to make the file shareable using google drive

2019-02-17 13:48发布

问题:

I am trying to get the file using google drive api, by default the file is not shareable i want to make it shareable.

Here is my code:-

    <script type="text/javascript" src="https://apis.google.com/js/api.js"></script>
<script src="https://apis.google.com/js/client.js"></script>
        // The Browser API key obtained from the Google Developers Console.
            // Replace with your own Browser API key, or your own key.
            var developerKey = 'XXXXXXXXXX_ff_NX66eb-XXXXXXXXXXX';

            // The Client ID obtained from the Google Developers Console. Replace with your own Client ID.
            var clientId = "XXXXXXXXXX-hs4ujaro5sc3d0g8qndtcq2tl279cfm1.apps.googleusercontent.com"

            // Replace with your own App ID. (Its the first number in your Client ID)
            var appId = "XXXXXXXXXX";
            // Scope to use to access user's Drive items.
            var scope = ['https://www.googleapis.com/auth/drive'];

            var pickerApiLoaded = false;
            var oauthToken;

                  $scope.addGoogleDriveFile = function() {
                    gapi.load('auth', {'callback': onAuthApiLoad});
                     gapi.load('picker', {'callback': onPickerApiLoad}); 
                    gapi.client.setApiKey(developerKey);     
                      }

        function onAuthApiLoad() {
                         window.gapi.auth.authorize(
                             {
                               'client_id': clientId,
                               'scope': scope,
                               'immediate': false
                             },
                             handleAuthResult);
                       }

                        function onPickerApiLoad() {
                          pickerApiLoaded = true;
                          createPicker();
                        }

                        function handleAuthResult(authResult) {
                          if (authResult && !authResult.error) {
                            oauthToken = authResult.access_token;
                            createPicker();
                          }
                        }

                        // Create and render a Picker object for searching images.
                        function createPicker() {
                          if (pickerApiLoaded && oauthToken) {
                            var view = new google.picker.View(google.picker.ViewId.DOCS);
                            var picker = new google.picker.PickerBuilder()
                                .enableFeature(google.picker.Feature.NAV_HIDDEN)
                                .setAppId(appId)
                                .setOAuthToken(oauthToken)
                                .addView(view)
                                .addView(new google.picker.DocsUploadView())
                                .setDeveloperKey(developerKey)
                                .setCallback(pickerCallback)
                                .build();
                             picker.setVisible(true);
                          }
                        }

                    // A simple callback implementation.
                    function pickerCallback(data) {
                      if (data.action == google.picker.Action.PICKED) {
                          console.log(data);
                       gapi.client.load('drive', 'v2').then(function() {
                            var request = gapi.client.drive.files.get({
                            'fileId': data.docs[0].id
                          });   
                           request.execute(function(resp) {
                             console.log(resp);
                          }); 
               });

                      }
                    }

I am getting the following response:-

{
 "kind": "drive#file",
 "id": "0B2Tb9btqdPGHeDl2NU5mYXRIaGc",
 "etag": "\"rCKCAyesbPCaBxGt0eDJcEBQNUI/MTQ1ODgxNDU0MDg2NA\"",
 "selfLink": "https://www.googleapis.com/drive/v2/files/0B2Tb9btqdPGHeDl2NU5mYXRIaGc",
 "webContentLink": "https://docs.google.com/uc?id=0B2Tb9btqdPGHeDl2NU5mYXRIaGc&export=download",
 "alternateLink": "https://drive.google.com/file/d/0B2Tb9btqdPGHeDl2NU5mYXRIaGc/view?usp=drivesdk",
 "iconLink": "https://ssl.gstatic.com/docs/doclist/images/icon_12_pdf_list.png",
 "thumbnailLink": "https://lh6.googleusercontent.com/iriNEeCbpP3OfCxntpc7sK7Dok03tcBJ86X4Be_sFgLXXG1Ta8b2WOM6pF6sEpS8ytaMvA
=s220",
 "title": "POTSS-2012.pdf",
 "mimeType": "application/pdf",
 "labels": {
  "starred": false,
  "hidden": false,
  "trashed": false,
  "restricted": false,
  "viewed": true
 },
 "createdDate": "2016-03-24T09:57:00.978Z",
 "modifiedDate": "2016-03-24T10:15:40.864Z",
 "modifiedByMeDate": "2016-03-24T09:57:00.978Z",
 "lastViewedByMeDate": "2016-03-24T09:57:00.978Z",
 "markedViewedByMeDate": "1970-01-01T00:00:00.000Z",
 "version": "130",
 "parents": [
  {
   "kind": "drive#parentReference",
   "id": "0AGTb9btqdPGHUk9PVA",
   "selfLink": "https://www.googleapis.com/drive/v2/files/0B2Tb9btqdPGHeDl2NU5mYXRIaGc/parents/0AGTb9btqdPGHUk9PVA"
,
   "parentLink": "https://www.googleapis.com/drive/v2/files/0AGTb9btqdPGHUk9PVA",
   "isRoot": true
  }
 ],
 "downloadUrl": "https://doc-0o-3g-docs.googleusercontent.com/docs/securesc/79n10ihd7kdei03rpq502qv5437nv33f
/b6p7kupn55cuqeqq8l0d9vc1orf4bkiv/1458813600000/07489391032112366212/07489391032112366212/0B2Tb9btqdPGHeDl2NU5mYXRIaGc
?e=download&gd=true",
 "userPermission": {
  "kind": "drive#permission",
  "etag": "\"rCKCAyesbPCaBxGt0eDJcEBQNUI/QKpDIyepJ3z6YHq0L3ksgvrZLSo\"",
  "id": "me",
  "selfLink": "https://www.googleapis.com/drive/v2/files/0B2Tb9btqdPGHeDl2NU5mYXRIaGc/permissions/me"
,
  "role": "owner",
  "type": "user"
 },
 "originalFilename": "POTSS-2012.pdf",
 "fileExtension": "pdf",
 "md5Checksum": "5b60cd94d0c0647c8828a60b8ce7efe4",
 "fileSize": "519097",
 "quotaBytesUsed": "519097",
 "ownerNames": [
  "xxxxx IT"
 ],
 "owners": [
  {
   "kind": "drive#user",
   "displayName": "xxxx IT",
   "isAuthenticatedUser": true,
   "permissionId": "07489391032112366212",
   "emailAddress": "it%xxxx .com@xxxxx.com"
  }
 ],
 "lastModifyingUserName": "xxxxx IT",
 "lastModifyingUser": {
  "kind": "drive#user",
  "displayName": "xxxx IT",
  "isAuthenticatedUser": true,
  "permissionId": "07489391032112366212",
  "emailAddress": "it%xxxx.com@xxxx.com"
 },
 "editable": true,
 "copyable": true,
 "writersCanShare": true,
 "shared": false,
 "explicitlyTrashed": false,
 "appDataContents": false,
 "headRevisionId": "0B2Tb9btqdPGHT0pGV1FRRis0MmlJVmZsOE5uMU5UK2FNR0g0PQ",
 "spaces": [
  "drive"
 ]
}

Here i want to change "shared": true Instead of "shared": false

How can i change its permission?

Any Idea?

Thanks

回答1:

@arun you may want to read more about Permission resource in Drive API. For "shared" to be true, each file permission needs to specifies a role, type, and email address or domain. As an owner of the file (Docs, Sheets, etc.), you will need to provide the appropriate permission to be set to.

Here is an example, using the Permissions.create (I recommend using Drive API v3)

POST https://www.googleapis.com/drive/v3/files/{fileId}/permissions?key={YOUR_API_KEY}

{
 "role": "reader",
 "type": "user",
 "emailAddress": "xxxxxxxx@xxx.com"
}

Response from the Drive Files.get:

GET https://www.googleapis.com/drive/v3/files/{fileId}?fields=appProperties%2CfileExtension%2Ckind%2CmimeType%2Cshared&key={YOUR_API_KEY}


{
 "kind": "drive#file",
 "mimeType": "application/vnd.google-apps.document",
 "shared": true
}

However, if you are unable to switch to the Drive v3, you can still use the Permission.insert from Drive v2 to do the job. Hope this helpful and good luck!



回答2:

The Quickest way to obtain the preview of the file would be to append /preview at the end of Alternate link.

Like so https://drive.google.com/file/d/0B2Tb9btqdPGHeDl2NU5mYXRIaGc/preview

You can then share that link to others.

Found this here when i was testing out api requests on the drive api.



回答3:

The issue I was having was I did not enable the Google Drive API in my Google developer console and I did not load the 'client' library in order for gapi.client.request() to work properly with Google Picker.

Below is a working example for a user to click a "share" button, authorize permission to their Google Drive, select multiple images or videos from the Picker modal, and return the file hyperlinks with 'anyone with the hyperlink can view' permissions.

Prerequisites:

  • Setup your credentials in the Google developer console
    • Obtain your developer ID, client ID, and app ID
  • Enable both the Picker and Drive APIs in the developer console

The javascript code:

<script type="text/javascript">
  // The API key obtained from the Google Developers Console.
  var developerKey = '#####';

  // The Client ID obtained from the Google Developers Console.
  var clientId = "####"

  // App ID. (Its the first number in your Client ID)
  var appId = "####";

  // Scope to use to access user's Drive items.
  var scope = ['https://www.googleapis.com/auth/drive'];

  var pickerApiLoaded = false;
  var oauthToken;

  // Use the Google API Loader script to load the google.picker script.
  function onApiLoad() {
    gapi.load('auth', {'callback': onAuthApiLoad});
    gapi.load('picker:client', {'callback': onPickerApiLoad});
  }

  function onAuthApiLoad() {
    window.gapi.auth.authorize(
      {
        'client_id': clientId,
        'scope': scope,
        'immediate': false
      },
      handleAuthResult);
  }

  function onPickerApiLoad() {
    pickerApiLoaded = true;
    createPicker();
  }

  function handleAuthResult(authResult) {
    if (authResult && !authResult.error) {
      oauthToken = authResult.access_token;
      createPicker();
    }
  }

  // Create and render a Picker object
  function createPicker() {
    if (pickerApiLoaded && oauthToken) {
      var view1 = new google.picker.DocsView(google.picker.ViewId.DOCS_IMAGES_AND_VIDEOS)
        .setIncludeFolders(true)
        .setSelectFolderEnabled(true);
      var picker = new google.picker.PickerBuilder()
        .enableFeature(google.picker.Feature.MULTISELECT_ENABLED)
        .addView(view1)
        .setAppId(appId)
        .setOAuthToken(oauthToken)
        .setDeveloperKey(developerKey)
        .setCallback(pickerCallback)
        .build();
      picker.setVisible(true);
    }
  }

  // A simple callback implementation.
  function pickerCallback(data) {
    var doc = "";
    var fileID = "";
    if (data[google.picker.Response.ACTION] == google.picker.Action.PICKED) {
      var gdurl = "";
      var type = "anyone";
      var role = "reader";
      for(var i = 0; i < data[google.picker.Response.DOCUMENTS].length; i++){
        doc = data[google.picker.Response.DOCUMENTS][i];
        gdurl = gdurl + " " + doc[google.picker.Document.URL];
        
        //change the file permissions to share with anyone with the link
        fileID = doc[google.picker.Document.ID];
        var request1 = gapi.client.request({
          'path': '/drive/v3/files/' + fileID + '/permissions',
          'method': 'POST',
          'headers': {
            'Content-Type': 'application/json',
            'Authorization': 'Bearer ' + oauthToken
          },
          'body':{
            'role': role,
            'type': type
          }
        });
        request1.execute(function(resp) {
          console.log(resp);
        });
      }
      // Form and display the message with hyperlinks included
      var message = 'Google Drive media link(s): ' + gdurl;
      alert('Success! Here are the hyperlinks for anyone to view: ' + message);
    }
  }
  </script>

Then the button to call everything in the HTML:

<button onclick="onApiLoad()">Share via Google Drive</button>



回答4:

Using the answer under this question did it for me: make folder shared google drive api v3?

I applied it to 'file' rather than folder, made the type 'anyone' and role 'reader' - seems to be the equivalent of making the file shared.