google-api - desarrolladores - google drive json api
¿Cómo agrego/creo/inserto archivos a Google Drive a través de la API? (5)
¡Gracias por la explicación! Esto ha tomado mis horas de dar vueltas en círculos con la documentación de google SDK horrible (lo siento, tuve que sacar mi diatriba).
Aquí hay una función que hice que actualizará un archivo de texto (como puede ver, estoy actualizando html):
function gd_updateFile(fileId, folderId, text, callback) {
const boundary = ''-------314159265358979323846'';
const delimiter = "/r/n--" + boundary + "/r/n";
const close_delim = "/r/n--" + boundary + "--";
var contentType = "text/html";
var metadata = {''mimeType'': contentType,};
var multipartRequestBody =
delimiter + ''Content-Type: application/json/r/n/r/n'' +
JSON.stringify(metadata) +
delimiter + ''Content-Type: '' + contentType + ''/r/n'' + ''/r/n'' +
text +
close_delim;
if (!callback) { callback = function(file) { console.log("Update Complete ",file) }; }
gapi.client.request({
''path'': ''/upload/drive/v2/files/''+folderId+"?fileId="+fileId+"&uploadType=multipart",
''method'': ''PUT'',
''params'': {''fileId'': fileId, ''uploadType'': ''multipart''},
''headers'': {''Content-Type'': ''multipart/mixed; boundary="'' + boundary + ''"''},
''body'': multipartRequestBody,
callback:callback,
});
}
Es un mashup del ejemplo de google (que usa un archivo binario de la carga), y la buena explicación de @Nivco arriba.
Necesita ayuda con respecto a la inserción de un archivo en Google Drive a través de API. La documentación de la API para este propósito no explica claramente cómo enviar el cuerpo real del archivo a través de la solicitud posterior a http.
4 años después, esto todavía es difícil de descubrir. Tomé la respuesta de @ user1158023 para admitir la carga de imágenes. Estoy usando API v3 y superagent.js para ayudarme (ya que gapi.client.request está enviando la solicitud a content.googleapis.com !?). Con suerte, alguien puede encontrar esto útil.
function gd_uploadFile(name, contentType, data, callback) {
const boundary = ''-------314159265358979323846'';
const delimiter = "/r/n--" + boundary + "/r/n";
const close_delim = "/r/n--" + boundary + "--";
contentType = contentType || "text/html";
var metadata = {
name: name,
''mimeType'': contentType
};
var multipartRequestBody =
delimiter + ''Content-Type: application/json/r/n/r/n'' +
JSON.stringify(metadata) +
delimiter +
''Content-Type: '' + contentType + ''/r/n'';
//Transfer images as base64 string.
if (contentType.indexOf(''image/'') === 0) {
var pos = data.indexOf(''base64,'');
multipartRequestBody += ''Content-Transfer-Encoding: base64/r/n'' + ''/r/n'' +
data.slice(pos < 0 ? 0 : (pos + ''base64,''.length));
} else {
multipartRequestBody += + ''/r/n'' + data;
}
multipartRequestBody += close_delim;
if (!callback) { callback = function(file) { console.log("Update Complete ", file) }; }
superagent.post(''https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart'').
set(''Content-Type'', ''multipart/form-data; boundary="'' + boundary + ''"'').
set(''Authorization'', ''Bearer '' + gapi.auth.getToken().access_token).
send(multipartRequestBody).
end(function () {
console.log(arguments);
});
}
//On upload
$(''#file'')[0].onchange = function () {
var file = $(''#file'')[0].files[0];
if (file && file.type === ''image/jpeg'') {
var reader = new FileReader();
reader.onloadend = function () {
var data = reader.result;
gd_uploadFile(''img.jpg'', ''image/jpeg'', data, function () {
console.log(arguments);
});
}
reader.readAsDataURL(file);
}
};
index.html
...
<form>
<span>Upload: </span><input id="file" type="file" name="myFile">
</form>
...
El equipo de la API de Google Drive lanzó v3 a finales de 2015, y en esa versión, insert()
cambió los nombres para create()
para reflejar mejor la operación del archivo. La documentación también se ha mejorado: ahora hay una guía especial dedicada a las cargas (simple, multiparte y reanudable) que viene con código de muestra en Java, Python, PHP, C # /. NET, Ruby, JavaScript / Node.js, y iOS / Obj-C para cargar un archivo normal y otro para importar un archivo CSV como una hoja de Google.
Para mostrar que es sencillo, a continuación se muestra una solución alternativa de Python (para la muestra en los documentos) para archivos cortos ("carga simple") donde no necesita la clase apiclient.http.MediaFileUpload
. Este fragmento asume que su código de autenticación funciona donde su punto final del servicio es DRIVE
con un alcance de autenticación mínimo de https://www.googleapis.com/auth/drive.file
.
# filenames & MIMEtypes
DST_FILENAME = ''inventory''
SRC_FILENAME = DST_FILENAME + ''.csv''
SHT_MIMETYPE = ''application/vnd.google-apps.spreadsheet''
CSV_MIMETYPE = ''text/csv''
# Import CSV file to Google Drive as a Google Sheets file
METADATA = {''name'': DST_FILENAME, ''mimeType'': SHT_MIMETYPE}
rsp = DRIVE.files().create(body=METADATA, media_body=SRC_FILENAME).execute()
if rsp:
print(''Imported %r to %r (as %s)'' % (SRC_FILENAME, DST_FILENAME, rsp[''mimeType'']))
Tenga en cuenta que si está escribiendo una aplicación de Android, hay una API de Google Drive separada para Android con su propio conjunto de documentos. Finalmente, si usa JavaScript en Google Apps Script, tanto el objeto nativo del Servicio de Drive como el Servicio Avanzado de Drive todavía usan la v2 de la API.
La documentación sobre las operaciones de inserción ya contiene ejemplos en una gran cantidad de lenguajes de programación, he aquí cómo hacerlo usando el protocolo basado en HTTP de la API de Google Drive.
Primero, PUBLIQUE los nuevos metadatos del archivo al punto final de Drive. Tiene que ser en forma de un objeto JSON de recursos de archivos :
POST /drive/v2/files HTTP/1.1
Host: www.googleapis.com
Authorization: Bearer <OAuth 2.0 access token here>
...
{
"title": "file_name.extension",
"mimeType": "mime/type",
"description": "Stuff about the file"
}
El cuerpo de respuesta será una representación JSON del recurso de archivo recién creado. Se verá así:
{
"kind": "drive#file",
"id": string,
"etag": etag,
"selfLink": string,
"title": "file_name",
"mimeType": "mime/type",
"description": "Stuff about the file"
...
"downloadUrl": string,
...
}
Esta es una confirmación de que se ha creado la entrada del archivo. Ahora necesitas subir el contenido. Para hacerlo, debe tomar el ID del archivo proporcionado por el atributo id JSON en la respuesta anterior y PONER el contenido del archivo real en el punto final de carga con una solicitud autorizada de OAuth 2.0. Debería verse así:
PUT /upload/drive/v2/files/{id}?uploadType=media HTTP/1.1
Host: www.googleapis.com
Authorization: Bearer <OAuth 2.0 access token here>
Content-Type: mime/type
<file content here>
Estás listo :)
También hay una forma de hacer esto en 1 solicitud POST única usando una solicitud multiparte donde publica los metadatos del archivo al mismo tiempo que el contenido. Aquí hay un ejemplo:
POST /upload/drive/v2/files HTTP/1.1
Host: www.googleapis.com
Authorization: Bearer <OAuth 2.0 access token here>
Content-Type: multipart/form-data; boundary=287032381131322
...
--287032381131322
Content-Type: application/json
{
"title": "file_name.extension",
"mimeType": "mime/type",
"description": "Stuff about the file"
}
--287032381131322
Content-Type: mime/type
<file content here>
--287032381131322--
La respuesta contendrá los metadatos del archivo recién creado. También puede usar el encabezado Content-Transfer-Encoding: base64 en la parte secundaria de la solicitud para poder pasar los datos del archivo codificados como Base 64.
Por último, también hay un protocolo de carga reanudable que es conveniente para cargar archivos de gran tamaño, ofrecer una función de pausa / reanudar y / o cargar archivos con escasa conexión a Internet.
PD: la mayor parte de esto ahora se describe en la documentación de carga de archivos de Drive .
Quisiera que hubiera mejores ejemplos para drive gapis v3 ... Me llevó algo de tiempo descubrir cómo cargar contenido nuevo en un archivo existente creado con
gapi.client.drive.files.create({ "name" : "savefile.txt" }).execute(function(file) { console.log("Created file " + file.name + " id: " + file.id); });
pero finalmente probé la combinación "afortunada" de agregar el archivoID a la ruta y cambiar el método a PATCH
function uploadFile(id, text)
{
var auth_token = gapi.auth.getToken().access_token;
const boundary = ''-------314159265358979323846'';
const delimiter = "/r/n--" + boundary + "/r/n";
const close_delim = "/r/n--" + boundary + "--";
var metadata = {
description : ''savefile for my game'',
''mimeType'': ''application/json''
};
var multipartRequestBody =
delimiter + ''Content-Type: application/json/r/n/r/n'' +
JSON.stringify(metadata) +
delimiter + ''Content-Type: application/json/r/n/r/n'' +
text +
close_delim;
gapi.client.request
( {
''path'': ''/upload/drive/v3/files/''+id,
''method'': ''PATCH'',
''params'': {''fileId'': id, ''uploadType'': ''multipart''},
''headers'': { ''Content-Type'': ''multipart/form-data; boundary="'' + boundary + ''"'', ''Authorization'': ''Bearer '' + auth_token, },
''body'': multipartRequestBody
}).execute(function(file) { console.log("Wrote to file " + file.name + " id: " + file.id); });
}
Pero supongo que ahora toda la documentación en https://developers.google.com/drive/v3/reference/files/update comienza a tener sentido para mí :-)