简体   繁体   English

如何在 Powerbi 中存储数据以实现自定义视觉效果

[英]How to store data in Powerbi for custom visual

For my PowerBI custom visual I want to store some data in the storage.对于我的 PowerBI 自定义视觉对象,我想在存储中存储一些数据。 According to the documentation up to 1Mb are supported.根据文档,最多支持 1Mb。 It works fine for just 3_000 zeros, but 30_000 zeros are failing with an undefined error.它仅适用于 3_000 个零,但 30_000 个零因未定义错误而失败。 I use the Developer Visual to display my custom visual for debugging.我使用Developer Visual来显示我的自定义视觉以进行调试。

I tried storing data and then reading it (in the visual update) via:我尝试存储数据,然后通过以下方式读取它(在视觉更新中):

public update(options: VisualUpdateOptions) {
//...        
        // try loading data
        this.storageService.get("storage").then(data =>{
            console.log("Loaded storage: ", data);
        })
        .catch(err=>{
            console.error(err);
        });
        
        // remove any previous data
        this.storageService.remove("storage");
        // create sample data
        let content = '0'.repeat(30_000);
        // set storage data
        this.storageService.set("storage", content).then(f =>{
            console.log("Setting storage ... Finished!");                                
        })
        .catch(ex=>{
            console.error(ex); // Line 102
        });
//...
}

When saving the 30_000 character I get an "undefined" error:保存 30_000 字符时,出现“未定义”错误:

visual.ts:102 
        
       undefined
(anonymous) @ visual.ts:102
(anonymous) @ customVisualsHost.bundle.min.js:12
(anonymous) @ visualsandbox.minimal.externals.min.js:146
c @ visualsandbox.minimal.externals.min.js:146
fireWith @ visualsandbox.minimal.externals.min.js:146
(anonymous) @ visualsandbox.minimal.externals.min.js:146
c @ visualsandbox.minimal.externals.min.js:146
fireWith @ visualsandbox.minimal.externals.min.js:146
i.reject @ customVisualsHost.bundle.min.js:12
e.RejectPromise @ customVisualsHost.bundle.min.js:20
m.handleSetStorageData @ customVisualsHost.bundle.min.js:20
m.executeMessage @ customVisualsHost.bundle.min.js:20
m.onMessageReceived @ customVisualsHost.bundle.min.js:20
(anonymous) @ customVisualsHost.bundle.min.js:20
n.invokeHandler @ customVisualsHost.bundle.min.js:19
n.dispatchMessage @ customVisualsHost.bundle.min.js:19
n.onMessageReceived @ customVisualsHost.bundle.min.js:19
windowMessageHandler @ customVisualsHost.bundle.min.js:19
dispatch @ visualsandbox.minimal.externals.min.js:146
v.handle @ visualsandbox.minimal.externals.min.js:146
postMessage (async)
n.sendMessage @ powerbiportal.common.bundle.min.dec6934de4d55e7f019f.js:16
n.postMessage @ powerbiportal.common.bundle.min.dec6934de4d55e7f019f.js:16
e.postMessage @ powerbiportal.common.bundle.min.dec6934de4d55e7f019f.js:18
V.setStorageData @ powerbiportal.common.bundle.min.dec6934de4d55e7f019f.js:18
e.setStorageData @ powerbiportal.common.bundle.min.dec6934de4d55e7f019f.js:18
e.onMessageReceived @ powerbiportal.common.bundle.min.dec6934de4d55e7f019f.js:18
(anonymous) @ powerbiportal.common.bundle.min.dec6934de4d55e7f019f.js:18
n.invokeHandler @ powerbiportal.common.bundle.min.dec6934de4d55e7f019f.js:16
n.dispatchMessage @ powerbiportal.common.bundle.min.dec6934de4d55e7f019f.js:16
n.onMessageReceived @ powerbiportal.common.bundle.min.dec6934de4d55e7f019f.js:16
windowMessageHandler @ powerbiportal.common.bundle.min.dec6934de4d55e7f019f.js:16
dispatch @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:7
v.handle @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:7
t.invokeTask @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
Ve.invokeTask @ web.min.386bab8ebb751022ba05.js:1
e.runTask @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
e.invokeTask @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
g @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
y @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
postMessage (async)
n.sendMessage @ customVisualsHost.bundle.min.js:19
n.postMessage @ customVisualsHost.bundle.min.js:19
t.setStorageData @ customVisualsHost.bundle.min.js:20
e.set @ customVisualsHost.bundle.min.js:19
update @ visual.ts:98
update @ customVisualsHost.bundle.min.js:19
(anonymous) @ customVisualsHost.bundle.min.js:19
t.trackVisualTime @ customVisualsHost.bundle.min.js:19
t.update @ customVisualsHost.bundle.min.js:19
(anonymous) @ customVisualsHost.bundle.min.js:19
(anonymous) @ customVisualsHost.bundle.min.js:19
(anonymous) @ customVisualsHost.bundle.min.js:19
(anonymous) @ customVisualsHost.bundle.min.js:19
n @ customVisualsHost.bundle.min.js:12
__awaiter @ customVisualsHost.bundle.min.js:19
(anonymous) @ customVisualsHost.bundle.min.js:19
(anonymous) @ customVisualsHost.bundle.min.js:19
(anonymous) @ customVisualsHost.bundle.min.js:19
(anonymous) @ customVisualsHost.bundle.min.js:19
(anonymous) @ customVisualsHost.bundle.min.js:19
n @ customVisualsHost.bundle.min.js:12
__awaiter @ customVisualsHost.bundle.min.js:19
o.executeSafelyAsync @ customVisualsHost.bundle.min.js:19
o.update @ customVisualsHost.bundle.min.js:19
m.fixUpdateOptionsAndUpdateVisual @ customVisualsHost.bundle.min.js:20
m.update @ customVisualsHost.bundle.min.js:20
m.executeMessage @ customVisualsHost.bundle.min.js:20
m.onMessageReceived @ customVisualsHost.bundle.min.js:20
(anonymous) @ customVisualsHost.bundle.min.js:20
n.invokeHandler @ customVisualsHost.bundle.min.js:19
n.dispatchMessage @ customVisualsHost.bundle.min.js:19
n.onMessageReceived @ customVisualsHost.bundle.min.js:19
windowMessageHandler @ customVisualsHost.bundle.min.js:19
dispatch @ visualsandbox.minimal.externals.min.js:146
v.handle @ visualsandbox.minimal.externals.min.js:146
postMessage (async)
n.flushQueue @ powerbiportal.common.bundle.min.dec6934de4d55e7f019f.js:16
e.ready @ powerbiportal.common.bundle.min.dec6934de4d55e7f019f.js:18
e.onIFrameLoad @ powerbiportal.common.bundle.min.dec6934de4d55e7f019f.js:18
(anonymous) @ powerbiportal.common.bundle.min.dec6934de4d55e7f019f.js:18
i @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:7
dispatch @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:7
v.handle @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:7
t.invokeTask @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
Ve.invokeTask @ web.min.386bab8ebb751022ba05.js:1
e.runTask @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
e.invokeTask @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
g @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
y @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
load (async)
R @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
t.scheduleTask @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
e.scheduleTask @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
e.scheduleEventTask @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
(anonymous) @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
add @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:7
(anonymous) @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:7
each @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:7
each @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:7
ke @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:7
one @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:7
e.initContainer @ powerbiportal.common.bundle.min.dec6934de4d55e7f019f.js:18
(anonymous) @ powerbiportal.common.bundle.min.dec6934de4d55e7f019f.js:18
i.<computed> @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
t.invokeTask @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
Ve.invokeTask @ web.min.386bab8ebb751022ba05.js:1
e.runTask @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
e.invokeTask @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
invoke @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
n.args.<computed> @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
setTimeout (async)
c @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
t.scheduleTask @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
e.scheduleTask @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
e.scheduleMacroTask @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
v @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
(anonymous) @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
A.i.<computed> @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
e.init @ powerbiportal.common.bundle.min.dec6934de4d55e7f019f.js:18
(anonymous) @ powerbiportal.common.bundle.min.dec6934de4d55e7f019f.js:18
t.invoke @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
Ve.invoke @ web.min.386bab8ebb751022ba05.js:1
e.run @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
(anonymous) @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
t.invokeTask @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
Ve.invokeTask @ web.min.386bab8ebb751022ba05.js:1
e.runTask @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
m @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
e.invokeTask @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
g @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
y @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
load (async)
R @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
t.scheduleTask @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
e.scheduleTask @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
e.scheduleEventTask @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
(anonymous) @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
i.set @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
send @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:7
ajax @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:7
S.each.S.<computed> @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:7
(anonymous) @ powerbiportal.common.bundle.min.dec6934de4d55e7f019f.js:18
c @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:7
fireWith @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:7
l @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:7
(anonymous) @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:7
x @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
t.invokeTask @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
Ve.invokeTask @ web.min.386bab8ebb751022ba05.js:1
e.runTask @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
e.invokeTask @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
g @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
y @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
load (async)
R @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
t.scheduleTask @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
e.scheduleTask @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
e.scheduleEventTask @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
(anonymous) @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
i.set @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
send @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:7
ajax @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:7
(anonymous) @ powerbiportal.common.bundle.min.dec6934de4d55e7f019f.js:18
c @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:7
fireWith @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:7
l @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:7
(anonymous) @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:7
x @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
t.invokeTask @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
Ve.invokeTask @ web.min.386bab8ebb751022ba05.js:1
e.runTask @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
e.invokeTask @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
g @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
y @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
load (async)
R @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
t.scheduleTask @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
e.scheduleTask @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
e.scheduleEventTask @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
(anonymous) @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
i.set @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
send @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:7
ajax @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:7
S.each.S.<computed> @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:7
getJSON @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:7
(anonymous) @ powerbiportal.common.bundle.min.dec6934de4d55e7f019f.js:18
c @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:7
fireWith @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:7
l @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:7
(anonymous) @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:7
x @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
t.invokeTask @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
Ve.invokeTask @ web.min.386bab8ebb751022ba05.js:1
e.runTask @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
e.invokeTask @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
g @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
y @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
load (async)
R @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
t.scheduleTask @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
e.scheduleTask @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
e.scheduleEventTask @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
(anonymous) @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
i.set @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
send @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:7
ajax @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:7
S.each.S.<computed> @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:7
i.reloadAdapter @ powerbiportal.common.bundle.min.dec6934de4d55e7f019f.js:18
(anonymous) @ powerbiportal.common.bundle.min.dec6934de4d55e7f019f.js:18
dispatch @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:7
v.handle @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:7
t.invokeTask @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
Ve.invokeTask @ web.min.386bab8ebb751022ba05.js:1
e.runTask @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
e.invokeTask @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
g @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
y @ powerbiportal.dependencies.externals.bundle.min.9334277c97a1912dee40.js:5
Show 35 more frames

Update更新

Now I cleaned my browsers local storage and session storage with:现在我清理了我的浏览器本地存储和会话存储:

localStorage.clear();
sessionStorage.clear();

It increased the amount I'm able to save at once to 60_000.它使我一次可以节省的金额增加到 60_000。 But when writing 50_000 and 9_000 it still fails with the same error (directly after that remove and write 60_000 is working).但是当写入 50_000 和 9_000 时,它仍然失败并出现同样的错误(在删除和写入 60_000 之后直接工作)。

My current assumption is, that only ~60kb are available for the custom visuals.我目前的假设是,只有大约 60kb 可用于自定义视觉效果。

Info信息

I solved my problem by reworking the access to external data by removing the dependency on using the PowerBI storage in the visual.我通过消除对在视觉对象中使用 PowerBI 存储的依赖来重新处理对外部数据的访问,从而解决了我的问题。 This also enables me to store more data than 1mb.这也使我能够存储超过 1mb 的数据。

My workaround我的解决方法

The data I want to storage I now moved to a separate Azure Storage Blob and created a new SAS (Shared Access Signature) for accessing the blob.我现在要存储的数据已移至单独的 Azure 存储 Blob,并创建了一个新的 SAS(共享访问签名)来访问该 Blob。 Next hurdle is that the fetch request is blocked by cors so we need to configure Allowed origins = null , Allowed methods = GET and Max age = 200 .下一个障碍是 fetch 请求被 cors 阻止,因此我们需要配置Allowed origins = nullAllowed methods = GETMax age = 200

To the settings I added an option in the capabilities.json , to let me configure a url which I can query.在设置中,我在capabilities.json添加了一个选项,让我配置一个可以查询的 url。

"objects":   {
        "general": {
            "displayName": "General settings",
            "properties": {
                "myurl": {
                    "displayName": "Url where data is stored.",
                    "type": { "text": true }
                }
            }
        },
...

Then make sure the settings are displayed to the user for the custom visual by adding the following method to visual.ts :然后通过将以下方法添加到visual.ts来确保向用户显示自定义视觉对象的设置:

export class Visual implements IVisual {
// ...

    // This is needed to ensure the settings are displayed on the Format-Tab
    public enumerateObjectInstances(options: EnumerateVisualObjectInstancesOptions): VisualObjectInstance[] | VisualObjectInstanceEnumerationObject {
        return VisualSettings.enumerateObjectInstances(this.settings || VisualSettings.getDefault(), options);
    }

When everything is configured we can use the fetch api in typescript to get the data and further process it.当一切都配置好后,我们可以使用 typescript 中的 fetch api 来获取数据并进一步处理它。

private async GetData(): Promise<string> {
let url = this.settings.general.myurl;
if (url) {
    try {
        let resp = await fetch(url, {
                referrer: "https://app.powerbi.com",
                headers: {
                    // "Origin": "https://app.powerbi.com", // PowerBI sets this to null
                }
            });

        let txt = await resp.text();
        return Promise.resolve(txt);
    } catch (err) {
        return Promise.reject("Request failed.");
    }
}
return Promise.reject("No url defined.");
}

For the write we just need to add the following to the cors configuration: Allowed origins = null , Allowed methods = PUT , Allowed headers=authorization,x-ms-blob-content-disposition,x-ms-blob-type,x-ms-date,x-ms-meta-m1,x-ms-meta-m2,x-ms-version and Exposed headers = x-ms-blob* .对于写入,我们只需在 cors 配置中添加以下内容: Allowed origins = null , Allowed methods = PUT , Allowed headers=authorization,x-ms-blob-content-disposition,x-ms-blob-type,x-ms-date,x-ms-meta-m1,x-ms-meta-m2,x-ms-versionExposed headers = x-ms-blob* Then we can use the REST API to upload the data.然后我们可以使用 REST API 上传数据。

private async SetData(data: string): Promise<void> {
        let url = this.settings.general.saveurl; // URL with SAS token
        if (url) {
            try {
                let resp = await fetch(url, {
                    referrer: "https://app.powerbi.com",
                    headers: {
                        // "Origin": "https://app.powerbi.com", // PowerBI sets this to null
                        "x-ms-version": "2017-11-09",
                        "x-ms-date": new Date().toISOString().split('T')[0],
                        "Content-Type": "text/plain; charset=UTF-8",
                        "x-ms-blob-content-disposition": "attachment; filename=\"mydata.txt\"",
                        "x-ms-blob-type": "BlockBlob",
                        "x-ms-meta-m1": "v1",
                        "x-ms-meta-m2": "v2",
                        // "Authorization": "SharedKey myaccount:..." // not needed with sas token
                    },
                    method: "PUT",
                    body: data
                });
                return Promise.resolve();
            } catch (err) {
                return Promise.reject("Request failed.");
            }
        }
        return Promise.reject("No save url defined.");
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM