Google Drive API Javascript를 통해 URL에서 Google Drive로 이미지 업로드
나는 Javascript가 처음이며 내 질문이 절름발이로 보이면 죄송합니다. 내 웹 사이트에서 내 Google 드라이브로 이미지를 업로드하고 싶습니다. 인증 및 폴더 생성 부분을 성공적으로 구현했지만 업로드 과정이 혼란 스럽습니다.
다음은 Google 드라이브 내부에 폴더를 만드는 코드입니다.
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;
}
});
}
이제이 URL에서 내 이미지 https://xxxxxx.com
를 상단 응답에서 새로 만든 폴더로 업로드하고 싶습니다 ( file.id
)
이것은 Google API 문서에있는 것이지만 URL을 어디에 넣거나 첨부해야합니까?
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);
}
});
}
많은 감사드립니다.
답변
나는 당신의 목표를 다음과 같이 믿습니다.
- URL에서 파일을 다운로드하고 다운로드 한 파일을 Javascript를 사용하여 Google 드라이브에 업로드하려고합니다.
- 귀하의 경우
gapi.client
Google 드라이브에 파일을 업로드하는 데 사용할 수 있습니다.
수정 지점 :
- 현재 단계에서는 안타깝게도
gapi.client.drive.files.create
콘텐츠를 포함한 요청을 아직 보낼 수없는 것 같습니다 . Ref 따라서이 경우fetch
에는 해결 방법 으로 사용할 것을 제안하고 싶습니다 . 때fetch
사용되며, 파일 내용과 메타 데이터로 요청할 수 있습니다multipart/form-data
. - 이 해결 방법에서 액세스 토큰은
gapi.client
. 따라서이 스크립트gapi.client
는 파일 업로드에 사용할 수 있다고 가정 합니다. 조심하세요.
수정 된 스크립트 :
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));
});
이 스크립트를 실행하면 콘솔에서 다음 결과를 볼 수 있습니다. (URL이 Jpeg 이미지 파일의 직접 링크 인 경우.)
{ "kind": "drive#file", "id": "###", "name": "sample filename", "mimeType": "image/jpeg" }
노트 :
- 이 경우
uploadType=multipart
사용됩니다. 따라서 최대 파일 크기는 5MB입니다. 조심하세요. 5MB 이상을 사용하려면 재개 가능한 업로드를 확인하십시오. Ref
참조 :
- Fetch 사용
- 파일 데이터 업로드
추가 :
CORS와 관련된 오류를 피하기 위해 다른 방법으로 Web Apps를 래퍼로 사용할 것을 제안하고 싶습니다. 이 경우 클라이언트 측은 Javascript입니다. 이 자바 스크립트는 Google 외부에서 사용할 수 있습니다.
용법:
다음 흐름을 수행하십시오.
1. Google Apps Script의 새 프로젝트를 만듭니다.
Web Apps의 샘플 스크립트는 Google Apps Script입니다. 따라서 Google Apps Script 프로젝트를 만드십시오.
직접 생성하려면 https://script.new/. 이 경우 Google에 로그인되어 있지 않으면 로그인 화면이 열립니다. 그러니 Google에 로그인하십시오. 이에 따라 Google Apps Script의 스크립트 편집기가 열립니다.
2. 스크립트를 준비합니다.
다음 스크립트 (Google Apps Script)를 복사하여 스크립트 편집기에 붙여 넣으십시오. 이 스크립트는 Web Apps 용입니다.
서버 측 : Google Apps Script이 스크립트는 Web Apps에 사용됩니다. 이 경우 Web Apps가 래퍼로 사용됩니다.
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 Apps의 URL을 복사합니다. 마치
https://script.google.com/macros/s/###/exec
.- Google Apps Script를 수정 한 경우 새 버전으로 다시 배포하세요. 이에 따라 수정 된 스크립트가 Web Apps에 반영됩니다. 조심하세요.
4. 클라이언트 측에서 서버 측으로 파일을 업로드합니다.
클라이언트 측 : HTML 및 자바 스크립트웹 애플리케이션의 URL을 다음 스크립트로 설정하십시오. 그리고 파일 이름과 폴더 ID를 설정하십시오.
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);
결과:
위의 스크립트가 실행되면 다음 값이 반환됩니다. 콘솔에서 반환 된 값을 볼 수 있습니다.
{
"id": "###",
"name": "###",
"mimeType": "###"
}
노트 :
- Web Apps의 스크립트를 수정 한 경우 Web Apps를 새 버전으로 재배포하십시오. 이를 통해 최신 스크립트가 Web Apps에 반영됩니다. 조심하세요.
참조 :
- 웹 앱
- Google Apps Script로 웹 애플리케이션 활용
다음 스 니펫을 사용하여 사진 파일을 업로드 해보세요.
// 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)
})
}
선적 서류 비치
- 파일 : 생성