Google Drive API Javascript ile URL'den Google Drive'a resim yükleyin

Aug 18 2020

Javascript'te yeniyim ve sorum size kötü görünüyorsa özür dilerim. Web sitemden Google Drive'ıma bir resim yüklemek istiyorum. Kimlik Doğrulama ve Klasör oluşturma bölümünü başarıyla uyguladım, ancak karşıya yükleme işlemi konusunda kafam karıştı.
Bunun Google Drive içinde klasör oluşturmak için kodum olduğunu söyleyin:

function createFolder(folderName) {
  var parentId = 'xxxxxxx';//some parentId of a folder under which to create the new folder
  var fileMetadata = {
    'name' : folderName,
    'mimeType' : 'application/vnd.google-apps.folder',
    'parents': [parentId]
  };
  gapi.client.drive.files.create({
    resource: fileMetadata,
  }).then(function(response) {
    switch(response.status){
      case 200:
      var file = response.result;
      console.log('Created Folder Id: ', file.id);
      uploadImage(file.id);
      break;
      default:
      console.log('Error creating the folder, '+response);
      break;
    }
  });
}

Şimdi bu url'den resmimi yüklemek istiyorum: https://xxxxxx.comüst yanıttan yeni oluşturulan klasöre ( file.id)

Bu, Google API belgelerinde bulduğum şeydir, ancak url'mi bunun içine nereye koymalıyım?

function uploadImage(folderId) {
  var fileMetadata = {
    'name': 'photo.jpg',
    parents: [folderId]
  };
  var media = {
    mimeType: 'image/jpeg',
    body: fs.createReadStream('files/photo.jpg')
  };
  drive.files.create({
    resource: fileMetadata,
    media: media,
    fields: 'id'
  }, function (err, file) {
    if (err) {
      // Handle error
      console.error(err);
    } else {
      console.log('File Id: ', file.id);
    }
  });
}   

Şimdiden çok teşekkürler.

Yanıtlar

1 Tanaike Aug 19 2020 at 08:26

Amacınızın aşağıdaki gibi olduğuna inanıyorum.

  • Bir URL'den bir dosya indirmek ve indirilen dosyayı Javascript kullanarak Google Drive'a yüklemek istiyorsunuz.
  • Sizin durumunuzda, gapi.clientdosyayı Google Drive'a yüklemek için kullanabilirsiniz.

Değişiklik noktaları:

  • Şu anki aşamada maalesef gapi.client.drive.files.createiçeriğiyle birlikte talebi hala gönderemiyor gibi görünüyor . Ref Yani bu durumda, fetchgeçici bir çözüm olarak kullanmayı önermek istiyorum . Ne zaman fetchkullanılır, dosya içeriği ve meta ile talep edilebilir multipart/form-data.
  • Bu geçici çözümde, erişim belirteci gapi.client. Dolayısıyla bu komut dosyası gapi.client, dosyayı yüklemek için kullanılabileceğinizi varsayar . Lütfen buna dikkat edin.

Değiştirilmiş komut dosyası:

const url = "###";  // Please set the URL.
const fileName = "sample filename";
const folderId = "###";  // Please set the folder ID.

fetch(url).then(res => res.blob()).then(blob => {
  const form = new FormData();
  form.append('metadata', new Blob([JSON.stringify({name: fileName, parents: [folderId]})], {type: 'application/json'}));
  form.append('file', blob);
  fetch('https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart', {
    method: 'POST',
    headers: new Headers({'Authorization': 'Bearer ' + gapi.auth.getToken().access_token}),
    body: form
  }).then(res => res.json()).then(val => console.log(val));
});
  • Bu betiği çalıştırdığınızda, aşağıdaki sonuç konsolda görülebilir. (URL, Jpeg resim dosyasının doğrudan bağlantısı olduğunda.)

      {
        "kind": "drive#file",
        "id": "###",
        "name": "sample filename",
        "mimeType": "image/jpeg"
      }
    

Not:

  • Bu durumda uploadType=multipartkullanılır. Yani maksimum dosya boyutu 5 MB'dir. Lütfen buna dikkat edin. 5 MB'den fazla kullanmak istediğinizde, lütfen Devam ettirilebilir yüklemeyi işaretleyin. Referans

Referanslar:

  • Getirmeyi Kullanma
  • Dosya verilerini yükle

Katma:

CORS ile ilgili hatayı önlemek için başka bir yöntem olarak Web Uygulamalarını bir sarmalayıcı olarak kullanmayı önermek istiyorum. Bu durumda, istemci tarafı Javascript'tir. Bu Javascript, Google'ın dışında kullanılabilir.

Kullanım:

Lütfen aşağıdaki akışı yapın.

1. Yeni Google Apps Komut Dosyası projesi oluşturun.

Web Apps komut dosyası örnek bir Google Apps Komut Dosyasıdır. Bu yüzden lütfen bir Google Apps Komut Dosyası projesi oluşturun.

Doğrudan oluşturmak istiyorsanız, lütfen şu adrese erişin: https://script.new/. Bu durumda Google'a giriş yapmadıysanız giriş ekranı açılır. Bu yüzden lütfen Google’a giriş yapın. Bununla, Google Apps Komut Dosyasının komut dosyası düzenleyicisi açılır.

2. Komut dosyası hazırlayın.

Lütfen aşağıdaki komut dosyasını (Google Apps Komut Dosyası) kopyalayıp komut dosyası düzenleyicisine yapıştırın. Bu komut dosyası Web Uygulamaları içindir.

Sunucu tarafı: Google Apps Komut Dosyası

Bu komut dosyası, Web Uygulamaları için kullanılır. Bu durumda, Web Uygulamaları sarmalayıcı olarak kullanılır.

function doGet(e) {
  const imageUrl = e.parameter.imageUrl;
  const res = UrlFetchApp.fetch(imageUrl);
  if (res.getResponseCode() != 200) throw new Error("Image couldn't be retrieved.");
  const blob = res.getBlob();
  const file = DriveApp.getFolderById(e.parameter.folderId).createFile(blob.setName(e.parameter.filename));
  const obj = {id: file.getId(), name: file.getName(), mimeType: file.getMimeType()};
  return ContentService.createTextOutput(JSON.stringify(obj)).setMimeType(ContentService.MimeType.JSON);
}

3. Web Uygulamalarını Dağıtın.

  1. Komut dosyası düzenleyicide, "Yayınla" -> "Web uygulaması olarak dağıt" seçeneğiyle bir iletişim kutusu açın.
  2. " Uygulamayı şu şekilde çalıştır:" için "Ben" i seçin .
    • Bununla, komut dosyası sahibi olarak çalıştırılır.
  3. " Uygulamaya erişimi olanlar:" için "Herkes, hatta anonim" seçeneğini seçin .
  4. Yeni "Proje sürümü" olarak "Dağıt" düğmesini tıklayın.
  5. Otomatik olarak "Yetkilendirme gerekli" iletişim kutusunu açın.
    1. "İzinleri İncele" yi tıklayın.
    2. Kendi hesabını seçin.
    3. "Bu uygulama doğrulanmadı" bölümünde "Gelişmiş" i tıklayın.
    4. "### proje adına git ### (güvenli değil)" seçeneğine tıklayın
    5. "İzin Ver" düğmesini tıklayın.
  6. "Tamam" ı tıklayın.
  7. Web Uygulamalarının URL'sini kopyalayın. Gibi https://script.google.com/macros/s/###/exec.
    • Google Apps Komut Dosyasını değiştirdiğinizde, lütfen yeni sürüm olarak yeniden dağıtın. Bununla, değiştirilen komut dosyası Web Uygulamalarına yansıtılır. Lütfen buna dikkat edin.

4. İstemci tarafından sunucu tarafına bir dosya yükleyin.

İstemci tarafı: HTML ve Javascript

Lütfen Web Uygulamalarınızın URL'sini aşağıdaki komut dosyasına ayarlayın. Ve lütfen dosya adını ve klasör kimliğini ayarlayın.

const imageUrl = "###"; // Please set the URL of image.

const url = "https://script.google.com/macros/s/###/exec"; // Please set the URL of Web Apps.
const qs = new URLSearchParams({
  imageUrl: imageUrl,
  filename: "sample filename",
  folderId: "###", // Please set folder ID.
});
fetch(`${url}?${qs}`).then((res) => res.json()).then(console.log).catch(console.log);
Sonuç:

Yukarıdaki komut dosyası çalıştırıldığında aşağıdaki değer döndürülür. Döndürülen değeri konsolda görebilirsiniz.

{
  "id": "###",
  "name": "###",
  "mimeType": "###"
}

Not:

  • Web Apps komut dosyasını değiştirdiğinizde, lütfen Web Uygulamalarını yeni sürüm olarak yeniden dağıtın. Bununla, en son komut dosyası Web Uygulamalarına yansıtılır. Lütfen buna dikkat edin.

Referanslar:

  • ağ uygulamaları
  • Google Apps Komut Dosyası ile Web Uygulamalarından yararlanma
1 JeffRush Aug 18 2020 at 21:23

Bu pasajı kullanarak fotoğraf dosyanızı yüklemeyi deneyin:

// download file from website 
const http  = require('https')
const fs    = require('fs')

let file    = fs.createWriteStream('Photo001.jpg')
let request = http.get(
    'https://ssl.gstatic.com/ui/v1/icons/mail/rfr/logo_gmail_lockup_default_2x.png', 
    (response) => {
        response.pipe(file)
    })

// upload file to Google Drive
let fileMetadata = {
  'name'    : 'Photo001',
  'mimeType': 'image/jpeg'
}

let media = {
  mimeType  : 'image/jpeg',
  body      : fs.createReadStream('Photo001.jpeg')
}

function uploadFile(auth){

  const drive = google.drive({version: 'v3', auth})

  drive.files.create({
    resource: fileMetadata,
    media   : media,
    fields  : 'id'
  }, (err, res) => {
    if (err) return console.log('The API returned an error: ' + err)
  })

}

Dokümantasyon

  • Dosyalar: oluştur