在 laravel vapor signed-storage-url 中使用 Axios 默认值

Use Axios defaults in laravel vapor signed-storage-url

使用 Tymon jwt 令牌进行身份验证。 Laravel 工作正常。

当使用 Laravel vapor 的上传到 S3 代码时,我无法让 signed-storage-url 使用我的 axios 默认值:

axios.defaults.headers.common["Authorization"] = 'Bearer ' + token;

文档中显示的存储方法:

Vapor.store(this.$refs.file.files[0], {
    progress: progress => {
        this.uploadProgress = Math.round(progress * 100);
    }
}).then(response => {
...

它在 npm 包的 index.js 中调用它:

async store(file, options = null) {
        // want this to use my default header.
        const response = await axios.post('/vapor/signed-storage-url', {
            'bucket': options.bucket || '',
            'content_type': options.contentType || file.type,
            'expires': options.expires || ''
        });

可能与 npm 模块不在正确范围内有关。

我已经覆盖 vapor-core signed-storage-url 控制器来使用令牌,并且可以让它在 Postman 中正常工作。 它调用 Vapor.store 不会将令牌添加到 axios 调用中,我看不到传递 headers.

的方法

编辑:您无需注册 Vapor 即可使用这些软件包。

composer require laravel/vapor-core

npm install --save-dev laravel-vapor

已解决 所以为了完成这项工作,我将异步存储方法复制到我的 vue 组件方法并从那里调用它。获取默认 headers 但 ...

这造成了 S3 的 axios header 问题,通过这样做解决了:

async store(file, options = null) {
            const response = await axios.post('/vapor/signed-storage-url', {
                'bucket': options.bucket || '',
                'content_type': options.contentType || file.type,
                'expires': options.expires || ''
            });

            if (typeof options.progress === 'undefined') {
                options.progress = () => {};
            }
// This is the fix for the headers. Instance just for the S3 PUT
            var instance = axios.create();
            instance.defaults.headers.common = {};
            const s3Response = await instance.put(response.data.url, file, {
                headers: response.data.headers,
                onUploadProgress: (progressEvent) => {
                    options.progress(progressEvent.loaded / progressEvent.total);
                }
            });

            response.data.extension = file.name.split('.').pop()

            return response.data;
        },

感谢https://github.com/axios/axios/issues/382#issuecomment-254712154