【问题标题】:Issue with uploading files on azure blob storage在 azure blob 存储上上传文件的问题
【发布时间】:2018-02-18 04:52:55
【问题描述】:

我正在使用 azure blob 存储,我已经使用 PHP 语言完成了,现在我想使用 jquery 在 azure blob 存储上上传文件,所以我使用了一个插件,当我尝试上传文件时它是在控制台中给我错误

跨域请求被阻止:同源策略不允许读取 远程资源(原因:CORS 标头 'Access-Control-Allow-Origin' 缺失)。

我了解了 CORS 配置,并在 Azure Blob 存储中启用了该配置,这是我的屏幕截图

这是我的 jquery 代码

$(function () {
        var ju = {
            sasUrl: $('#txtSAS'),
            list: $('#tbFileList tbody'),
            btnUpload: $('#btnUpload'),
            btnClear: $('#btnClear'),
            btnAddFile: $('#btnAddFile'),
            sasSearchName: 'sas',
            btnLink: $('#btnLink'),
            linkPopover: $('#linkPopover'),
            init: function () {
                this.root = location.href;
                if (this.root.indexOf('?') > 0) {
                    this.root = this.root.substr(0, this.root.indexOf('?'));
                    this.root = this.root.replace(/#/g, '');
                }
                this.btnClear.hide();
                var sas = this.queryString(this.sasSearchName);
                if (sas) {
                    this.sasUrl.val(sas);
                }
                this.list.blobuploader(
                {
                    url: ju.sasUrl.val(),
                    beforeSend: function (blob) {
                    },
                    progress: function (blob) {
                        ju.progress(blob.element.closest('tr'), blob.loaded, blob.size);
                    },
                    success: function (blob, data, status) {
                        var st = blob.speed(true);
                        var msg = 'total time: ' + ((st.end - st.start) / 1000).toFixed(2) + 'S<br/>'
                            + 'max speed: ' + st.max + '<br/>'
                            + 'min speed: ' + st.min + '<br/>'
                            + 'average speed: ' + st.average;
                        ju.status(blob.element, msg);
                        var download = '<a target="_blank" role="button" class="btn btn-link" href="'
                            + blob.blobUrl
                            + '" >' + blob.name + '</a>';
                        ju.log(blob.element.closest('tr').find('td:first'), download);
                    },
                    error: function (blob, block, xhr, desc, err) {
                        var msg = $('<span></span>');
                        msg.append('upload ' + blob.name + ' error.');
                        var btn = $('<button type="button" id="btnUpload" class="btn btn-sm btn-primary pull-right" role="button">Retry</button>');
                        btn.click(function () {
                            ju.retry($(this).closest('tr'));
                        });
                        msg.append(btn)
                        ju.status(blob.element, msg, 'danger');
                    }
                });
                this.btnClear.click(function () {
                    ju.clear();
                });
                this.btnAddFile.find('input').on('change', function () {
                    ju.add();
                });
                this.btnUpload.click(function () {
                    ju.upload();
                });
                this.btnLink.popover({
                    html: true,
                    content: this.linkPopover,
                    container: 'body'
                });
                this.btnLink.on('shown.bs.popover', function () {
                    var panel = $('#linkPopover');
                    panel.find('#txtShareUrl').val(ju.getLongUrl());
                    panel.find('#ckShortUrl').click(function () {
                        if ($(this).is(':checked')) {
                            ju.generateShortUrl();
                        } else {
                            panel.find('#txtShareUrl').val(ju.getLongUrl());
                        }
                    })
                    panel.find('.close').click(function () {
                        ju.btnLink.popover('toggle');
                    });
                    panel.find('#ckShortUrl').attr('checked', false);
                    panel.find('.loading').hide();
                });
                this.sasUrl.on('change', function () {
                    ju.linkPopover.find('#ckShortUrl').attr('ckecked', false);
                    ju.linkPopover.find('.loading').hide();
                });
                var code = $('.prettyprint');
                code.text(code.text().replace('site-domain', location.origin));
            },
            progress: function (tr, loaded, total) {
                var percent = (loaded / total * 100).toFixed(2);
                var span = tr.find('td:last .percent');
                if (span.length == 0) {
                    span = $('<span class="percent"/>').appendTo(tr.find('td:last').empty());
                }
                span.text(percent + '%');
            },
            log: function (td, message, type) {
                var div = td.empty();
                if (type) {
                    div = $('<div class="alert alert-' + type + '"/>').appendTo(td);
                }
                if (message instanceof jQuery) {
                    div.append(message);
                } else {
                    div.html(message);
                }
            },
            information: function (element, info, type) {
                var td = element.closest('tr').find('td:eq(1)');
                if (info) {
                    ju.log(td, info, type);
                } else {
                    return td.html();
                }
            },
            status: function (element, message, type) {
                var td = element.closest('tr').find('td:last');
                if (message) {
                    ju.log(td, message, type);
                } else {
                    return td.html();
                }
            },
            add: function () {
                var tr = $('<tr/>'), td = $('<td/>');
                var file = this.btnAddFile.find('input');
                this.btnAddFile.append(file.clone(true));
                var f = file.get(0).files[0];
                td.append(file)
                    .append(f.name)
                    .appendTo(tr);
                td = $('<td/>')
                    .append(f.type, f.type ? '<br/>' : '', (f.size / 1000).toFixed(2) + 'KB')
                    .appendTo(tr);
                $('<td><span class="percent"></span></td>').appendTo(tr);
                tr.appendTo(this.list);
                this.btnClear.show();
            },
            setProperties: function () {
                if (!this.sasUrl.val()) {
                    alert('Please typedin the Container SAS');
                    return;
                }
                var blockSize = parseInt($('#txtBlockSize').val());
                var maxThread = parseInt($('#txtMaxThread').val());
                if (isNaN(blockSize) || isNaN(maxThread)) {
                    alert("Block Size and Max Thread can only be number.");
                    return;
                }
                if (blockSize > 4096) {
                    alert('The block size should be less than 4096kb');
                    return;
                }
                if (blockSize < 1) {
                    alert('The block size should be greater than 1kb');
                    return;
                }
                if (maxThread < 0) {
                    maxThread = 0;
                }
                this.list.blobuploader('option', { maxThread: maxThread, blockSizeKB: blockSize, url: this.sasUrl.val() });
                return true;
            },
            upload: function () {
                if (this.setProperties()) {
                    this.list.blobuploader('upload');
                }
            },
            retry: function (tr) {
                if (this.setProperties()) {
                    if (tr) {
                        var element = tr.find('input[type="file"]');
                        var blob = this.list.blobuploader('blob', element);
                        this.list.blobuploader('retry', blob);
                    } else {
                        this.list.blobuploader('retry');
                    }
                }
            },
            clear: function () {
                this.list.empty();
                this.btnClear.hide();
            },
            queryString: function (name, value) {
                if (!value) {
                    name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
                    var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),
                        results = regex.exec(location.search);
                    return results == null ? "" : atob(decodeURIComponent(results[1].replace(/\+/g, " ")));
                } else {
                    return name + '=' + encodeURIComponent(btoa(value));
                }
            },
            getLongUrl: function () {
                return this.root + '?' + this.queryString('sas', this.sasUrl.val());
            },
            generateShortUrl: function () {
                var request = gapi.client.urlshortener.url.insert({
                    'resource': {
                        'longUrl': this.getLongUrl()
                    }
                });
                request.execute(function (response) {
                    if (response.id != null) {
                        ju.linkPopover.find('.loading').hide();
                        ju.linkPopover.find('#txtShareUrl').val(response.id);
                    }
                    else {
                        ju.linkPopover.find('.loading').text('error.');
                    }
                });
            }
        }
        ju.init();
        prettyPrint();
    })
    function gapiload() {
        gapi.client.setApiKey('AIzaSyDzeVB4WDi6azVvIu6uc8hIhWxf99dB6c8');
        gapi.client.load('urlshortener', 'v1', function () { });
    }

在输入中,我们需要添加“在此处输入您的容器 SAS”,我在此处添加 https://*****.blob.core.windows.net/?sv=2017-04-17&amp;ss=bfqt&amp;s‌​rt=sco&amp;sp=rwdlacup&amp;s‌​e=2017-09-10T01:51:2‌​0Z&amp;st=2017-09-09T17:‌​51:20Z&amp;spr=https&amp;sig‌​=****** 这个 SAS url,它会得到这个 SAS url,然后我们需要选择文件并上传它。 谁能告诉我确切的问题是什么? 谢谢

【问题讨论】:

  • 请将公开的标头更改为*(如允许的标头)。允许的来源、动词、允许和公开的标头中的任何不匹配都会导致您面临这个问题。
  • 我这样做了,我仍然遇到同样的错误
  • 请在您的问题本身中包含此代码和您的代码,而不是在 cmets 中。
  • 请停止在 cmets 中提供这些详细信息。在问题本身中添加所有相关信息。您一定已经编写了一些使用这个库的代码(一些 HTML 页面、一些 JS 代码等)。请将其也包含在问题中。
  • 所以我有机会从 Github 存储库下载代码并运行演示。我能够从本地计算机成功上传文件(虽然这是一个非常小的文件)。所以代码工作得很好。我建议您首先检查 CORS 规则和共享访问签名。您可能想要编写一些代码(不是 HTML/JS...可能是 C#)并尝试使用该代码使用 SAS 上传 blob。

标签: azure cors azure-storage azure-blob-storage


【解决方案1】:

我还下载并测试了该库,它在我的 blob 存储服务上进行了以下设置后运行良好。 MaxAgeInSeconds 设置将缓存预检 OPTIONS 请求。我建议你将它重置为 0 并再次运行你的代码(请使用不同的浏览器测试它)。

此外,Azure 存储面板下还有多项 CORS 设置。请确保您为 Azure Blob 存储设置了正确的设置。

【讨论】:

    猜你喜欢
    • 2015-12-10
    • 2015-06-16
    • 2017-01-24
    • 2017-08-19
    • 2021-05-23
    • 2019-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多