É possível compartilhar um arquivo publicamente através da API do Google Drive?
-
11-12-2019 - |
Pergunta
Eu estou trabalhando em Google drive application
o que permitirá ao usuário criar um arquivo que deve ser público.
Pude ver alguns exemplos onde podemos criar um arquivo no Google Drive através de APIs.
Mas, ao criar um arquivo, é possível compartilhar um arquivo como public
.
Solução
Você pode definir a lista de controle de acesso do arquivo usando o feed de permissões.A documentação está localizada aqui:
https://developers.google.com/drive/v2/reference/permissions
Para tornar um arquivo público você precisará atribuir a função reader
para o tipo anyone
Então, se quiser um link para compartilhar com as pessoas, você pode pegar o webContentLink
URL retornado nos metadados do arquivo na API, permitirá que qualquer usuário baixe o arquivo.Você também pode usá-lo para incorporar o arquivo compartilhado em HTML (por exemplo, imagens em <img>
Tag) .
Outras dicas
Acho que seria bom mostrar o exemplo de código com base na resposta fornecida pela Nivco.Usando Javascript você pode fazer assim:
var google = require('googleapis');
var _ = require('lodash-node/compat');
var Q = require('q');
var OAuth2 = google.auth.OAuth2;
var CLIENT_ID = '...';
var CLIENT_SECRET = '...';
var REDIRECT_URL = '...';
var shareFile = function (fileName) {
var deferred = Q.defer();
var drive = google.drive('v2');
var auth = new OAuth2(CLIENT_ID, CLIENT_SECRET, REDIRECT_URL);
drive.files.list({auth: auth}, function (err, res) {
var foundFile = _.first(_.filter(res.items, {title: fileName, "explicitlyTrashed": false}));
if (!foundFile) {
deferred.reject('File ' + fileName + ' has not been found.');
return;
}
drive.permissions.list({fileId: foundFile.id, auth: auth}, function (err, res) {
if (_.isEmpty(_.find(res.items, 'role', 'reader'))) {
var body = {
'value': 'default',
'type': 'anyone',
'role': 'reader'
};
drive.permissions.insert({
fileId: foundFile.id,
resource: body,
auth: auth
}, function (err, res, body) {
deferred.resolve(body);
});
}
});
});
return deferred.promise;
};