복붙노트

[NODEJS] 중포 기지 용 클라우드 기능으로 업로드 된 파일에서 다운로드 URL 받기

NODEJS

중포 기지 용 클라우드 기능으로 업로드 된 파일에서 다운로드 URL 받기

해결법


  1. 1.당신은을 통해 getSignedURL를 사용하여 서명 된 URL을 생성해야합니다 @ 구글 클라우드 / 저장 NPM 모듈을.

    당신은을 통해 getSignedURL를 사용하여 서명 된 URL을 생성해야합니다 @ 구글 클라우드 / 저장 NPM 모듈을.

    예:

    const gcs = require('@google-cloud/storage')({keyFilename: 'service-account.json'});
    // ...
    const bucket = gcs.bucket(bucket);
    const file = bucket.file(fileName);
    return file.getSignedUrl({
      action: 'read',
      expires: '03-09-2491'
    }).then(signedUrls => {
      // signedUrls[0] contains the file's public URL
    });
    

    당신은 초기화해야합니다 @ 구글 클라우드 / 스토리지를 서비스 계정 자격 증명을 사용하여 응용 프로그램의 기본 자격 증명이 충분하지 않으므로.

    업데이트 : 클라우드 스토리지 SDK는 이제 래퍼 역할을 중포 기지 관리 SDK를 통해 액세스 할 수 있습니다 @ 구글 클라우드 / 저장. 그것이 유일한 방법은 당신이 경우 중 하나입니다 :


  2. 2.여기에 업로드에 토큰 다운로드를 지정하는 방법에 대한 예입니다 :

    여기에 업로드에 토큰 다운로드를 지정하는 방법에 대한 예입니다 :

    const UUID = require("uuid-v4");
    
    const fbId = "<YOUR APP ID>";
    const fbKeyFile = "./YOUR_AUTH_FIlE.json";
    const gcs = require('@google-cloud/storage')({keyFilename: fbKeyFile});
    const bucket = gcs.bucket(`${fbId}.appspot.com`);
    
    var upload = (localFile, remoteFile) => {
    
      let uuid = UUID();
    
      return bucket.upload(localFile, {
            destination: remoteFile,
            uploadType: "media",
            metadata: {
              contentType: 'image/png',
              metadata: {
                firebaseStorageDownloadTokens: uuid
              }
            }
          })
          .then((data) => {
    
              let file = data[0];
    
              return Promise.resolve("https://firebasestorage.googleapis.com/v0/b/" + bucket.name + "/o/" + encodeURIComponent(file.name) + "?alt=media&token=" + uuid);
          });
    }
    

    다음으로 전화

    upload(localPath, remotePath).then( downloadURL => {
        console.log(downloadURL);
      });
    

    여기서 중요한 점은 메타 데이터 옵션 속성 내에 중첩 된 메타 데이터 개체가 있다는 것입니다. UUID는-V4 값에 firebaseStorageDownloadTokens을 설정하면 공개 인증 토큰으로 그것을 사용하는 클라우드 스토리지를 말할 것이다.

    @martemorfosis에 많은 감사


  3. 3.이 답변은 구글 / 중포 기지 클라우드 스토리지에 파일을 업로드 할 때 다운로드 URL을 취득하기위한 옵션을 요약 한 것입니다. 다운로드 URL이 세 가지 유형이 있습니다 :

    이 답변은 구글 / 중포 기지 클라우드 스토리지에 파일을 업로드 할 때 다운로드 URL을 취득하기위한 옵션을 요약 한 것입니다. 다운로드 URL이 세 가지 유형이 있습니다 :

    토큰 다운로드 URL을 얻을 수있는 세 가지 방법이 있습니다. 다른 두 다운로드 URL은 그들을 얻을 수있는 유일한 방법이있다.

    중포 기지 스토리지 콘솔에서

    당신은 중포 기지 스토리지 콘솔에서 다운로드 URL을 얻을 수 있습니다 :

    다운로드 URL은 다음과 같습니다 :

    https://firebasestorage.googleapis.com/v0/b/languagetwo-cd94d.appspot.com/o/Audio%2FEnglish%2FUnited_States-OED-0%2Fabout.mp3?alt=media&token=489c48b3-23fb-4270-bd85-0a328d2808e5
    

    첫 번째 부분은 파일에 대한 표준 경로입니다. 끝에서 토큰입니다. 당신이 그것을 취소 할 수 있지만,이 다운로드 URL, 즉,이 만료되지 않습니다, 영구적입니다.

    프런트 엔드에서 getDownloadURL ()

    문서는 getDownloadURL ()를 사용하여 우리에게 알려줍니다 :

    let url = await firebase.storage().ref('Audio/English/United_States-OED-' + i +'/' + $scope.word.word + ".mp3").getDownloadURL();
    

    이것은 당신이 당신의 중포 기지 스토리지 콘솔에서 얻을 수있는 것과 같은 다운로드 URL을 가져옵니다. 이 방법은 간단하지만 당신이 내 애플 리케이션에 비교적 간단한 데이터베이스 구조에 대한 코드의 300 개 라인에 대한 귀하의 파일에 대한 경로를 알고 있어야합니다. 데이터베이스가 복잡하다면 이것은 악몽이 될 것입니다. 그리고 당신은 프런트 엔드에서 파일을 업로드 할 수 있지만,이 앱을 다운로드 한 사람에게 자격 증명을 노출한다. 그래서 대부분의 프로젝트를 위해 당신은, 당신의 노드 백 엔드 또는 Google 클라우드 기능에서 파일을 업로드 다운로드 URL을 얻을 파일에 대한 다른 데이터와 함께 데이터베이스에 저장하는 것이 좋습니다.

    임시 다운로드 URL에 대한 getSignedUrl ()

    getSignedUrl ()이 노드의 백 엔드 또는 Google 클라우드 기능에서 사용하기 쉬운 :

      function oedPromise() {
        return new Promise(function(resolve, reject) {
          http.get(oedAudioURL, function(response) {
            response.pipe(file.createWriteStream(options))
            .on('error', function(error) {
              console.error(error);
              reject(error);
            })
            .on('finish', function() {
              file.getSignedUrl(config, function(err, url) {
                if (err) {
                  console.error(err);
                  return;
                } else {
                  resolve(url);
                }
              });
            });
          });
        });
      }
    

    서명 된 다운로드 URL은 다음과 같습니다 :

    https://storage.googleapis.com/languagetwo-cd94d.appspot.com/Audio%2FSpanish%2FLatin_America-Sofia-Female-IBM%2Faqu%C3%AD.mp3?GoogleAccessId=languagetwo-cd94d%40appspot.gserviceaccount.com&Expires=4711305600&Signature=WUmABCZIlUp6eg7dKaBFycuO%2Baz5vOGTl29Je%2BNpselq8JSl7%2BIGG1LnCl0AlrHpxVZLxhk0iiqIejj4Qa6pSMx%2FhuBfZLT2Z%2FQhIzEAoyiZFn8xy%2FrhtymjDcpbDKGZYjmWNONFezMgYekNYHi05EPMoHtiUDsP47xHm3XwW9BcbuW6DaWh2UKrCxERy6cJTJ01H9NK1wCUZSMT0%2BUeNpwTvbRwc4aIqSD3UbXSMQlFMxxWbPvf%2B8Q0nEcaAB1qMKwNhw1ofAxSSaJvUdXeLFNVxsjm2V9HX4Y7OIuWwAxtGedLhgSleOP4ErByvGQCZsoO4nljjF97veil62ilaQ%3D%3D
    

    서명 된 URL은 유효 기간이 긴 서명이 있습니다. 명령 행에 대한 문서는 gsutil signurl -d 말한다 서명 URL이 일시적 것을 : 기본 만기는 1 시간 최대 만기는 7 일입니다.

    나는 getSignedUrl 결코 서명 된 URL은 일주일에 만료됩니다 말한다 것을 여기 호언 장담거야. 문서 코드는 미래에 만료 년 설정할 수있는 제안, 유효 기간 등의 2025년 3월 17일 있습니다. 내 응용 프로그램은 완벽하게 작동하고 일주일 후 추락했다. 오류 메시지는 서명 다운로드 URL이 만료 된하지 않는 것이 일치하지 않았다고 말했다. 나는 내 코드에 다양한 변화를 만들고, 모든 일을 ... 모두가 일주일 후 추락 할 때까지. 이것은 좌절의 한 달 이상했다.

    파일을 공개합니다

    문서에 설명 된대로, 공용 읽기에 파일에 대한 권한을 설정할 수 있습니다. 이는 클라우드 스토리지 브라우저에서 또는 노드 서버에서 수행 할 수 있습니다. 당신은 하나 개의 파일 공개 또는 디렉토리 또는 전체 저장소 데이터베이스를 만들 수 있습니다. 다음은 노드의 코드는 다음과 같습니다

    var webmPromise = new Promise(function(resolve, reject) {
          var options = {
            destination: ('Audio/' + longLanguage + '/' + pronunciation + '/' + word + '.mp3'),
            predefinedAcl: 'publicRead',
            contentType: 'audio/' + audioType,
          };
    
          synthesizeParams.accept = 'audio/webm';
          var file = bucket.file('Audio/' + longLanguage + '/' + pronunciation + '/' + word + '.webm');
          textToSpeech.synthesize(synthesizeParams)
          .then(function(audio) {
            audio.pipe(file.createWriteStream(options));
          })
          .then(function() {
            console.log("webm audio file written.");
            resolve();
          })
          .catch(error => console.error(error));
        });
    

    그 결과는 클라우드 스토리지 브라우저에서 다음과 같이 표시됩니다

    누구나 다음 파일을 다운로드 표준 경로를 사용할 수 있습니다 :

    https://storage.googleapis.com/languagetwo-cd94d.appspot.com/Audio/English/United_States-OED-0/system.mp3
    

    파일을 공개하는 또 다른 방법은 방법 makePublic을 사용하는 것입니다 (). 나는 일이를 얻을 수 없었다, 그것은 양동이와 파일 경로 권리를 얻기 위해 까다로운.

    흥미로운 대안은 액세스 제어 목록을 사용하는 것입니다. 당신은 당신이 목록에 넣어, 또는 구글 계정에 로그인 한 사람에게 파일을 사용할 수 있도록 authenticatedRead을 사용하는 사용자에게 파일을 사용할 수 있습니다. "중포 기지 인증을 사용하여 내 응용 프로그램에 로그인 한 사람"옵션이 있다면 그것은 단지 내 사용자에 대한 액세스를 제한하는 것처럼 나는이를 사용합니다.

    중포 기지 저장 다운로드 토큰과 함께 자신의 다운로드 URL 구축

    몇 가지 대답은 문서화되지 않은 Google 저장 객체 속성 firebaseStorageDownloadTokens을 설명합니다. 이 사용하면 스토리지를 사용할 토큰을 알 수 있습니다. 당신은 UUID 노드 모듈에 토큰을 생성 할 수 있습니다. 네 줄의 코드와 당신은 당신의 자신의 다운로드 URL, 콘솔 또는 getDownloadURL ()에서 얻을 같은 다운로드 URL을 구축 할 수 있습니다. 코드의 네 줄은 다음과 같습니다 :

    const uuidv4 = require('uuid/v4');
    const uuid = uuidv4();
    
    metadata: { firebaseStorageDownloadTokens: uuid }
    
    https://firebasestorage.googleapis.com/v0/b/" + bucket.name + "/o/" + encodeURIComponent('Audio/' + longLanguage + '/' + pronunciation + '/' + word + '.webm') + "?alt=media&token=" + uuid);
    

    여기에 컨텍스트의 코드는 다음과 같습니다

    var webmPromise = new Promise(function(resolve, reject) {
      var options = {
        destination: ('Audio/' + longLanguage + '/' + pronunciation + '/' + word + '.mp3'),
        contentType: 'audio/' + audioType,
        metadata: {
          metadata: {
            firebaseStorageDownloadTokens: uuid,
          }
        }
      };
    
          synthesizeParams.accept = 'audio/webm';
          var file = bucket.file('Audio/' + longLanguage + '/' + pronunciation + '/' + word + '.webm');
          textToSpeech.synthesize(synthesizeParams)
          .then(function(audio) {
            audio.pipe(file.createWriteStream(options));
          })
          .then(function() {
            resolve("https://firebasestorage.googleapis.com/v0/b/" + bucket.name + "/o/" + encodeURIComponent('Audio/' + longLanguage + '/' + pronunciation + '/' + word + '.webm') + "?alt=media&token=" + uuid);
          })
          .catch(error => console.error(error));
    });
    

    그건 오타 아니에요 - 메타 데이터의 이중 층에 둥지 firebaseStorageDownloadTokens에 있습니다 :!

    더그 스티븐슨 firebaseStorageDownloadTokens 공식 Google 클라우드 스토리지 기능 아니라고 지적했다. 당신은 모든 Google 문서를 찾을 수 없습니다, 그것은 미래의 버전에있을 것입니다 아무 약속도 없다 @ 구글 클라우드를. firebaseStorageDownloadTokens 같은 나는 내가 원하는 것을 얻을 수있는 유일한 방법이기 때문에,하지만 그것은 사용하기 안전하지하는 "냄새"가 있습니다.

    노드에서 왜 getDownloadURL ()?

    @Clinton가 썼던 것처럼, 구글은 @ 2 file.getDownloadURL ()에서 방법을 확인해야합니다 구글 클라우드 / 저장 (즉, 노드의 백 엔드). 나는 Google 클라우드 기능에서 파일을 업로드하고 토큰 다운로드 URL을 싶어.


  4. 4.당신이 중포 기지 프로젝트를 작업하는 경우, 다른 라이브러리를 포함하거나 인증 파일을 다운로드하지 않고 클라우드 기능의 URL을 체결 만들 수 있습니다. 당신은 (아래 참조) IAM API를 활성화하고 기존 서비스 계정에 역할을 추가해야합니다.

    당신이 중포 기지 프로젝트를 작업하는 경우, 다른 라이브러리를 포함하거나 인증 파일을 다운로드하지 않고 클라우드 기능의 URL을 체결 만들 수 있습니다. 당신은 (아래 참조) IAM API를 활성화하고 기존 서비스 계정에 역할을 추가해야합니다.

    관리자 라이브러리를 초기화하고 보통 때와 같이 파일 참조를 얻을 :

    import * as functions from 'firebase-functions'
    import * as admin from 'firebase-admin'
    
    admin.initializeApp(functions.config().firebase)
    
    const myFile = admin.storage().bucket().file('path/to/my/file')
    

    그런 다음에 서명 URL을 생성

    myFile.getSignedUrl({action: 'read', expires: someDateObj}).then(urls => {
        const signedUrl = urls[0]
    })
    

    있는지 확인 중포 기지의 서비스 계정이를 실행할 수있는 충분한 권한이

    바닐라 중포 기지 설정, 당신이 전에 프로젝트 XXXXXX에 사용되지 않은 위의 코드 오류 ID 및 액세스 관리 (IAM) API를 얻을 수 있습니다를 처음 실행할 때 또는 오류의 링크를 따라 경우에 .. 사용할 수 없습니다 권한 iam.serviceAccounts.signBlob 서비스에서이 작업을 수행하는 데 필요한 내-서비스 계정을 계정 : 메시지와 IAM의 API를 사용, 당신은 또 다른 오류가 발생합니다. 토큰 창조주의 역할을 추가하는 것은이 두 번째 권한 문제를 해결합니다.


  5. 5.기능 최근 변경 사항이 응답을 객체로 당신은 당신이 함께 다운로드 URL 같은 "스티치"에 필요한 모든 것을 얻을 수 있습니다 :

    기능 최근 변경 사항이 응답을 객체로 당신은 당신이 함께 다운로드 URL 같은 "스티치"에 필요한 모든 것을 얻을 수 있습니다 :

     const img_url = 'https://firebasestorage.googleapis.com/v0/b/[YOUR BUCKET]/o/'
    + encodeURIComponent(object.name)
    + '?alt=media&token='
    + object.metadata.firebaseStorageDownloadTokens;
    
    console.log('URL',img_url);
    

  6. 6.내가 성공을 사용하고 한 가지 방법은 중포 기지가 이러한 URL, 예를 생성하는 데 사용하는 구조 다음은 업로드를 완료 한 후 파일의 메타 데이터의 키에라는 이름의 firebaseStorageDownloadTokens을 UUID는 V4 값을 설정 한 후 다운로드 URL에게 자신을 조립하는 것입니다 :

    내가 성공을 사용하고 한 가지 방법은 중포 기지가 이러한 URL, 예를 생성하는 데 사용하는 구조 다음은 업로드를 완료 한 후 파일의 메타 데이터의 키에라는 이름의 firebaseStorageDownloadTokens을 UUID는 V4 값을 설정 한 후 다운로드 URL에게 자신을 조립하는 것입니다 :

    https://firebasestorage.googleapis.com/v0/b/[BUCKET_NAME]/o/[FILE_PATH]?alt=media&token=[THE_TOKEN_YOU_CREATED]
    

    나는 그러나 쉽게 구현할 수있다 (중포 기지가 미래에 다운로드 URL을 생성하는 방법을 변경할 수 주어진)이 방법을 사용하는 것이 얼마나 많은 "안전한"모른다.


  7. 7.중포 기지 관리 SDK serviceAccountKey.json 파일이 어디로 가야 궁금 겁니다. 그냥 평소와 같이 폴더 기능과 배포에 넣습니다.

    중포 기지 관리 SDK serviceAccountKey.json 파일이 어디로 가야 궁금 겁니다. 그냥 평소와 같이 폴더 기능과 배포에 넣습니다.

    우리는 자바 스크립트 SDK에서처럼 우리가 메타 데이터에서 다운로드 URL을 얻을 수없는 이유는 아직도 날 배플. 결국 만료 URL을 생성하고 데이터베이스에 저장하는 것은 바람직하지 않다.


  8. 8.당신은 당신의 코드에서 URL 접두어를 harcoding 피해야한다. 'publicRead'클라우드 스토리지 NodeJS 1.6.x 이상인 경우 또는 +로 파일을 업로드 : 나는 옵션 predefinedAcl을 사용하는 것이 좋습니다 :

    당신은 당신의 코드에서 URL 접두어를 harcoding 피해야한다. 'publicRead'클라우드 스토리지 NodeJS 1.6.x 이상인 경우 또는 +로 파일을 업로드 : 나는 옵션 predefinedAcl을 사용하는 것이 좋습니다 :

    const options = {
        destination: yourFileDestination,
        predefinedAcl: 'publicRead'
    };
    
    bucket.upload(attachment, options);
    

    그런 다음, 공공 URL을 얻는 것은 간단 같습니다 :

    bucket.upload(attachment, options).then(result => {
        const file = result[0];
        return file.getMetadata();
    }).then(results => {
        const metadata = results[0];
        console.log('metadata=', metadata.mediaLink);
    }).catch(error => {
        console.error(error);
    });
    

  9. 9.나는이 대답에 포함됩니다 미안하지만 난 때문에 명성을 누락 위의 질문에 코멘트를 게시 할 수 없습니다.

    나는이 대답에 포함됩니다 미안하지만 난 때문에 명성을 누락 위의 질문에 코멘트를 게시 할 수 없습니다.

    난 당신이에서 생성 할 수있는 serviceAccountKey.json를 사용해야 할 생각으로 서명 된 URL을 생성하지만, 대신 사용하여 위에서 언급 마십시오 서비스를-account.json (따라 YOURPROJECTID 교체)

    https://console.firebase.google.com/project/YOURPROJECTID/settings/serviceaccounts/adminsdk

    예:

    const gcs = require('@google-cloud/storage')({keyFilename: 'serviceAccountKey.json'});
    // ...
    const bucket = gcs.bucket(bucket);
    // ...
    return bucket.upload(tempLocalFile, {
            destination: filePath,
            metadata: {
              contentType: 'image/jpeg'
            }
          })
          .then((data) => {
            let file = data[0]
            file.getSignedUrl({
              action: 'read',
              expires: '03-17-2025'
            }, function(err, url) {
              if (err) {
                console.error(err);
                return;
              }
    
              // handle url 
            })
    

  10. 10.나는 제임스 다니엘 준 대답에 대해 언급 할 수 없지만, 나는이 읽기가 매우 중요하다고 생각합니다.

    나는 제임스 다니엘 준 대답에 대해 언급 할 수 없지만, 나는이 읽기가 매우 중요하다고 생각합니다.

    그가했던 것처럼 서명 된 URL을주는 것은 아주 나쁜와 위험한 가능한 많은 경우에 보인다. 중포 기지의 문서에 따르면 서명 된 URL이, 시간이 지나면 만료하여, 데이타베이스에 일정 기간 후 빈 URL로 이어질 것이라는 점을 추가하므로

    이 문서가 그 오해 할 수 있고, 서명 된 URL이 결과로 몇 가지 보안 문제가있을 것이다, 만료되지 않습니다. 열쇠는 모든 업로드 된 파일에 대한 동일한 것으로 보인다. 하나 개의 파일의 URL을 가지고 일단이 방법은, 누군가가 쉽게 액세스 파일을 그는 단지 자신의 이름을 알고에 의해, 액세스 suposed되지 수.

    내가 그 오해 경우 내가 해결할 수 싶어요. 다른 사람은 아마 위에 언급 된 솔루션을 업데이트해야합니다. 내가 잘못이있을 수 있습니다 경우


  11. 11.이것은, 내가 현재 무엇을 사용이 간단하며 완벽하게 작동합니다.

    이것은, 내가 현재 무엇을 사용이 간단하며 완벽하게 작동합니다.

    당신은 Google 클라우드에 작업을 수행 할 필요가 없습니다. 그것은 중포 기지와 함께 상자 밖으로 작동합니다 ..

    // Save the base64 to storage.
    const file = admin.storage().bucket('url found on the storage part of firebase').file(`profile_photos/${uid}`);
    await file.save(base64Image, {
        metadata: {
          contentType: 'image/jpeg',
        },
        predefinedAcl: 'publicRead'
    });
    const metaData = await file.getMetadata()
    const url = metaData[0].mediaLink
    

    편집하다: 같은 예,하지만 업로드와 :

    await bucket.upload(fromFilePath, {destination: toFilePath});
    file = bucket.file(toFilePath);
    metaData = await file.getMetadata()
    const trimUrl = metatata[0].mediaLink
    

    #최신 정보: 어떤 메타 데이터를 얻기 위해 업로드 방법에서 두 개의 서로 다른 통화를해야합니다

    let file = await bucket.upload(fromFilePath, {destination: toFilePath});
    const trimUrl = file[0].metatata.mediaLink
    

  12. 12.당신이 'publicRead'의 미리 정의 된 액세스 제어 목록 값을 사용하는 경우, 당신은 매우 간단한 URL 구조와 파일 액세스 업로드 할 수 있습니다 :

    당신이 'publicRead'의 미리 정의 된 액세스 제어 목록 값을 사용하는 경우, 당신은 매우 간단한 URL 구조와 파일 액세스 업로드 할 수 있습니다 :

    // Upload to GCS
    const opts: UploadOptions = {
      gzip: true,
      destination: dest, // 'someFolder/image.jpg'
      predefinedAcl: 'publicRead',
      public: true
    };
    return bucket.upload(imagePath, opts);
    

    당신은 다음과 같이 URL을 구성 할 수 있습니다 :

    const storageRoot = 'https://storage.googleapis.com/';
    const bucketName = 'myapp.appspot.com/'; // CHANGE TO YOUR BUCKET NAME
    const downloadUrl = storageRoot + bucketName + encodeURIComponent(dest);
    

  13. 13.내가 대신 README의 중포 기지 기능 예제의 코드를 찾고 있었어요,하지만 같은 문제가 있었다. 그리고이 스레드에 대한 답변이 도움이되지 않았다 ...

    내가 대신 README의 중포 기지 기능 예제의 코드를 찾고 있었어요,하지만 같은 문제가 있었다. 그리고이 스레드에 대한 답변이 도움이되지 않았다 ...

    다음을 수행하여 설정 파일을 전달 피할 수 있습니다 :

    출처 : 자동 썸네일 기능 README를 생성

    응용 프로그램 엔진에 대한 귀하의 역할은 다음과 같아야합니다 :


  14. 14.이 작품은 그냥 간단한 URL을 공개 파일이 필요합니다. 참고이 당신의 중포 기지 저장 규칙을 번복 할 수 있음.

    이 작품은 그냥 간단한 URL을 공개 파일이 필요합니다. 참고이 당신의 중포 기지 저장 규칙을 번복 할 수 있음.

    bucket.upload(file, function(err, file) {
        if (!err) {
          //Make the file public
          file.acl.add({
          entity: 'allUsers',
          role: gcs.acl.READER_ROLE
          }, function(err, aclObject) {
              if (!err) {
                  var URL = "https://storage.googleapis.com/[your bucket name]/" + file.id;
                  console.log(URL);
              } else {
                  console.log("Failed to set permissions: " + err);
              }
          });  
        } else {
            console.log("Upload failed: " + err);
        }
    });
    

  15. 15.중포 기지 SDK andadmin.initializeApp를 사용하는 사람들을 위해 :

    중포 기지 SDK andadmin.initializeApp를 사용하는 사람들을 위해 :

    1 - / 기능 폴더에 개인 키 및 장소를 생성합니다.

    2 - 구성 코드를 다음과 같이

    const serviceAccount = require('../../serviceAccountKey.json');
    try { admin.initializeApp(Object.assign(functions.config().firebase, { credential: admin.credential.cert(serviceAccount) })); } catch (e) {}
    

    선적 서류 비치

    은 try / 캐치 내가하는 index.js 그 수입 다른 파일을 사용하고 있기 때문입니다 각 파일에 하나 개의 함수를 작성합니다. 모든 기능을 하나의하는 index.js 파일을 사용하는 경우, 당신은 admin.initializeApp에 확인을해야 (Object.assign (functions.config () 중포 기지. {자격 : admin.credential.cert (serviceAccount)})) ;.


  16. 16.중포 기지 6.0.0이 같은 관리자와 직접 스토리지에 액세스 할 수 있었다 :

    중포 기지 6.0.0이 같은 관리자와 직접 스토리지에 액세스 할 수 있었다 :

    const bucket = admin.storage().bucket();
    

    그래서 서비스 계정을 추가 할 필요가 없습니다. 중포 기지 URL을 얻기 위해 일 이상 참조 그런 다음 UUID를 설정.


  17. 17.이것은 내가 해낸 것이 가장 좋습니다. 그것은 중복이지만, 유일한 합리적인 해결책은 나를 위해 일했다.

    이것은 내가 해낸 것이 가장 좋습니다. 그것은 중복이지만, 유일한 합리적인 해결책은 나를 위해 일했다.

    await bucket.upload(localFilePath, {destination: uploadPath, public: true});
    const f = await bucket.file(uploadPath)
    const meta = await f.getMetadata()
    console.log(meta[0].mediaLink)
    

  18. 18.없이 signedURL () makePublic를 사용하여 ()

    없이 signedURL () makePublic를 사용하여 ()

    const functions = require('firebase-functions');
    const admin = require('firebase-admin');
    
    admin.initializeApp()
    var bucket = admin.storage().bucket();
    
    // --- [Above] for admin related operations, [Below] for making a public url from a GCS uploaded object
    
    const { Storage } = require('@google-cloud/storage');
    const storage = new Storage();
    
    exports.testDlUrl = functions.storage.object().onFinalize(async (objMetadata) => {
        console.log('bucket, file', objMetadata.bucket + ' ' + objMetadata.name.split('/').pop()); // assuming file is in folder
        return storage.bucket(objMetadata.bucket).file(objMetadata.name).makePublic().then(function (data) {
            return admin.firestore().collection('publicUrl').doc().set({ publicUrl: 'https://storage.googleapis.com/' + objMetadata.bucket + '/' + objMetadata.name }).then(writeResult => {
                return console.log('publicUrl', writeResult);
            });
        });
    });
    

  19. 19.https://stackoverflow.com/users/269447/laurent 의해 답변을 가장 잘 작동

    https://stackoverflow.com/users/269447/laurent 의해 답변을 가장 잘 작동

    const uploadOptions: UploadOptions = {
        public: true
    };
    
    const bucket = admin.storage().bucket();
    [ffile] = await bucket.upload(oPath, uploadOptions);
    ffile.metadata.mediaLink // this is what you need
    

  20. 20.경우에 당신은 오류가 있습니다 :

    경우에 당신은 오류가 있습니다 :

    이 시도:

    const {Storage} = require('@google-cloud/storage');
    const storage = new Storage({keyFilename: 'service-account-key.json'});
    const bucket = storage.bucket(object.bucket);
    const file = bucket.file(filePath);
    .....
    

  21. 21.이 솔루션으로 전체 코드를 얻을 수있는 경우 URL 아래에 이미 ... 내 ANS를 게시

    이 솔루션으로 전체 코드를 얻을 수있는 경우 URL 아래에 이미 ... 내 ANS를 게시

    어떻게 Node.js를를 사용하여 Google 클라우드 스토리지 버킷에 직접 base64로 인코딩 된 이미지 (문자열)을 업로드하나요?

    const uuidv4 = require('uuid/v4');
    const uuid = uuidv4();
    
        const os = require('os')
        const path = require('path')
        const cors = require('cors')({ origin: true })
        const Busboy = require('busboy')
        const fs = require('fs')
        var admin = require("firebase-admin");
    
    
        var serviceAccount = {
            "type": "service_account",
            "project_id": "xxxxxx",
            "private_key_id": "xxxxxx",
            "private_key": "-----BEGIN PRIVATE KEY-----\jr5x+4AvctKLonBafg\nElTg3Cj7pAEbUfIO9I44zZ8=\n-----END PRIVATE KEY-----\n",
            "client_email": "xxxx@xxxx.iam.gserviceaccount.com",
            "client_id": "xxxxxxxx",
            "auth_uri": "https://accounts.google.com/o/oauth2/auth",
            "token_uri": "https://oauth2.googleapis.com/token",
            "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
            "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-5rmdm%40xxxxx.iam.gserviceaccount.com"
          }
    
        admin.initializeApp({
            credential: admin.credential.cert(serviceAccount),
            storageBucket: "xxxxx-xxxx" // use your storage bucket name
        });
    
    
        const app = express();
        app.use(bodyParser.urlencoded({ extended: false }));
        app.use(bodyParser.json());
    app.post('/uploadFile', (req, response) => {
        response.set('Access-Control-Allow-Origin', '*');
        const busboy = new Busboy({ headers: req.headers })
        let uploadData = null
        busboy.on('file', (fieldname, file, filename, encoding, mimetype) => {
            const filepath = path.join(os.tmpdir(), filename)
            uploadData = { file: filepath, type: mimetype }
            console.log("-------------->>",filepath)
            file.pipe(fs.createWriteStream(filepath))
          })
    
          busboy.on('finish', () => {
            const bucket = admin.storage().bucket();
            bucket.upload(uploadData.file, {
                uploadType: 'media',
                metadata: {
                  metadata: { firebaseStorageDownloadTokens: uuid,
                    contentType: uploadData.type,
                  },
                },
              })
    
              .catch(err => {
                res.status(500).json({
                  error: err,
                })
              })
          })
          busboy.end(req.rawBody)
       });
    
    
    
    
    exports.widgets = functions.https.onRequest(app);
    

  22. 22.내가 그것을 어떻게 파일을 공유 토큰 매개 변수를 사용하고, 인 gsutil 명령을 사용하고자 시도하는 사람들을 위해, 여기에 있습니다 :

    내가 그것을 어떻게 파일을 공유 토큰 매개 변수를 사용하고, 인 gsutil 명령을 사용하고자 시도하는 사람들을 위해, 여기에 있습니다 :

    먼저 실행하여 인증 할 필요가 : gcloud 인증을

    그런 다음 실행 :

    인 gsutil setmeta -h "X-GOOG-메타 firebaseStorageDownloadTokens : $ FILE_TOKEN"GS : // $ FIREBASE_REPO / $ FILE_NAME

    그럼 당신은 다음 링크를 사용하여 파일을 다운로드 할 수 있습니다 :

    https://firebasestorage.googleapis.com/v0/b/$FIREBASE_REPO/o/$FILE_NAME?alt=media&token=$FILE_TOKEN

  23. from https://stackoverflow.com/questions/42956250/get-download-url-from-file-uploaded-with-cloud-functions-for-firebase by cc-by-sa and MIT license