代码之家  ›  专栏  ›  技术社区  ›  Enrique Ramos Muñoz

Firebase存储不返回下载URL

  •  0
  • Enrique Ramos Muñoz  · 技术社区  · 6 年前

    我正在使用此代码更新图像并获取URL,但我无法获取URL。

    看来,回报一些是因为它可以进入回报的承诺。

    我从这里得到这个代码: https://gist.github.com/CristalT/2651023cfa2f36cddd119fd979581893

    代码为另一个用户工作,所以我认为问题在于依赖关系或数据库规则。

    我被认证了。

        <template>
    
          <div>
            <input type="file" multiple accept="image/*" @change="detectFiles($event.target.files)">
            <div class="progress-bar" :style="{ width: progressUpload + '%'}">{{ progressUpload }}%</div>
          </div>
    
        </template>
    
        <script>
        import { storage } from '../firebase'
        export default {
          data () {
            return {
              progressUpload: 0,
              file: File,
              uploadTask: '',
              downloadURL: ''
            }
          },
          methods: {
            detectFiles (fileList) {
              Array.from(Array(fileList.length).keys()).map( x => {
                this.upload(fileList[x])
              })
            },
            upload (file) {
              this.uploadTask = storage.ref('imagenes/articulos').put(file);
              this.uploadTask.then(snapshot => {
                this.downloadURL = this.uploadTask.snapshot.downloadURL;
                this.$emit('url', this.downloadURL)
              })
            }
          },
          watch: {
            uploadTask: function() {
              this.uploadTask.on('state_changed', sp => {
                this.progressUpload = Math.floor(sp.bytesTransferred / sp.totalBytes * 100)
              })
            }
          }
        }
        </script>
    
        <style>
        .progress-bar {
          margin: 10px 0;
        }
        </style>
    

    这是我的包裹。json:

    {
      "name": "vue-change-your-home",
      "version": "1.0.0",
      "description": "Single page make in vue",
      "author": "enrikiko <enrikiko_91@hotmail.com>",
      "private": true,
      "scripts": {
        "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
        "start": "npm run dev",
        "build": "node build/build.js"
      },
      "dependencies": {
        "@fortawesome/fontawesome": "^1.1.8",
        "@fortawesome/fontawesome-free-solid": "^5.0.13",
        "@fortawesome/vue-fontawesome": "0.0.22",
        "bootstrap-vue": "^2.0.0-rc.9",
        "firebase": "^5.0.2",
        "vue": "^2.5.2",
        "vue-router": "^3.0.1",
        "vuefire": "^1.4.5"
      },
      "devDependencies": {
        "autoprefixer": "^7.1.2",
        "babel-core": "^6.22.1",
        "babel-helper-vue-jsx-merge-props": "^2.0.3",
        "babel-loader": "^7.1.1",
        "babel-plugin-syntax-jsx": "^6.18.0",
        "babel-plugin-transform-runtime": "^6.22.0",
        "babel-plugin-transform-vue-jsx": "^3.5.0",
        "babel-preset-env": "^1.3.2",
        "babel-preset-stage-2": "^6.22.0",
        "chalk": "^2.0.1",
        "copy-webpack-plugin": "^4.0.1",
        "css-loader": "^0.28.0",
        "extract-text-webpack-plugin": "^3.0.0",
        "file-loader": "^1.1.4",
        "friendly-errors-webpack-plugin": "^1.6.1",
        "html-webpack-plugin": "^2.30.1",
        "node-notifier": "^5.1.2",
        "optimize-css-assets-webpack-plugin": "^3.2.0",
        "ora": "^1.2.0",
        "portfinder": "^1.0.13",
        "postcss-import": "^11.0.0",
        "postcss-loader": "^2.0.8",
        "postcss-url": "^7.2.1",
        "rimraf": "^2.6.0",
        "semver": "^5.3.0",
        "shelljs": "^0.7.6",
        "uglifyjs-webpack-plugin": "^1.1.1",
        "url-loader": "^0.5.8",
        "vue-loader": "^13.3.0",
        "vue-style-loader": "^3.0.1",
        "vue-template-compiler": "^2.5.2",
        "webpack": "^3.6.0",
        "webpack-bundle-analyzer": "^2.9.0",
        "webpack-dev-server": "^2.9.1",
        "webpack-merge": "^4.1.0"
      },
      "engines": {
        "node": ">= 6.0.0",
        "npm": ">= 3.0.0"
      },
      "browserslist": [
        "> 1%",
        "last 2 versions",
        "not ie <= 8"
      ]
    }
    

    以下是存储规则:

     service firebase.storage {
      match /b/{bucket}/o {
        match /{allPaths=**} {
          allow read, write: if request.auth != null;
        }
      }
    }
    

    这是我的火力基地。js: 从“Firebase”导入Firebase

    /**
     * Pega aquí los datos de tu proyecto firebase
     */
    const firebaseApp = Firebase.initializeApp({
      apiKey: "++++******-sU0qfey9278aBIDP6zo",
      authDomain: "*+****+.firebaseapp.com",
      databaseURL: "https://*****.firebaseio.com",
      projectId: "+++++",
      storageBucket: "**.appspot.com",
      messagingSenderId: "**"
      });
    
    export const db = firebaseApp.database()
    export const storage = firebaseApp.storage()
    export const auth = firebaseApp.auth()
    // export const notif = firebase.messaging()
    

    在航站楼,我得到的是:

    $route
    downloadURL:"" --->here shoud get the URL
    file:ƒ File()
    progressUpload:100
    uploadTask:Object
    authWrapper_:Object
    blob_:Object
    chunkMultiplier_:1
    errorHandler_:ƒ (error)
    error_:null
    location_:Object
    mappings_:Array[15]
    metadataErrorHandler_:ƒ (error)
    metadata_:Object
    

    非常感谢

    2 回复  |  直到 6 年前
        1
  •  4
  •   Héctor BlisS    6 年前

    我也有同样的问题,我尝试了很多东西,但我找到的唯一解决方案是:


    更改我的软件包中的Firebase版本。我切换到: "firebase": "^4.6.2" .


    我不确定5.0.2版到底发生了什么。即使解决了问题,我仍然在寻找更改的文档,也许我们需要以不同的方式使用快照。等着瞧吧。 祝你好运!;)

    --幸福

    更新:

    问题是snapshop在版本5中不再拥有downloadURL,现在您必须使用属于ref的getDownloadURL方法,就像俯卧撑所说的那样,类似这样:

    const fileRef = firebase.storage()
        .ref("carpeta")
        .child(file.name);
    
    const uploadTask = fileRef.put(file);
    
    uploadTask
        .then(snap=>{
          return fileRef.getDownloadURL()
        })
    

    这也适用于: 回击。参考getDownloadURL()

        2
  •  1
  •   Pushups    6 年前

    您可以通过以下代码将其与Firebase 5.2.0一起使用。

    UploadTaskPromise会生成一个快照。快照具有ref属性。ref属性有一个getDownloadURL()函数,该函数返回一个承诺。这个承诺提供了一个可下载的url。

    https://firebase.google.com/docs/reference/js/firebase.storage.Reference#getDownloadURL

    uploadTask.then((snapshot) => {
        snapshot.ref.getDownloadURL().then((url) => {
            // do something with url here
        });
    });