Don't miss your chance to take the Fabric Data Engineer (DP-600) exam for FREE! Find out how by attending the DP-600 session on April 23rd (pacific time), live or on-demand.
Learn moreNext up in the FabCon + SQLCon recap series: The roadmap for Microsoft SQL and Maximizing Developer experiences in Fabric. All sessions are available on-demand after the live show. Register now
Hello,
I am stuck trying to programmatically upload a .pbix file using the import API, making use of the request-promise library which is imported as "rp" here.
I am currently trying the following (in Node.js), which results in HTTP error 400:
let url = 'https://api.powerbi.com/v1.0/myorg/groups/' + groupId + '/imports';
let options = {
method: 'POST',
headers: {
'Content-Type': 'multipart/form-data',
'authorization': 'Bearer ' + accessToken
},
body: fs.createReadStream(__dirname + '/Report.pbix'),
url: 'https://api.powerbi.com/v1.0/myorg/groups/' + groupId + '/imports'
};
rp(options)
.then(function (body) {
console.log('success! ', body);
})
.catch(function (err) {
console.log('error', err);
});I also haven't had any success uploading the file using postman, where I have tried it with and without having set the Content-Type header.
What could I be doing wrong? What headers are necessary to upload this file and make a proper request?
Solved! Go to Solution.
I figured out what I did wrong. Apparently you need a datasetDisplayName which is part of the url.
Therefore this problem can be solved by appending the datasetDisplayName field to the url like this:
url: 'https://api.powerbi.com/v1.0/myorg/groups/' + groupId + '/imports?datasetDisplayName=' + reportName
This is Python equivalant to upload a .pbix local file into PowerBI server
import requests
from requests_toolbelt.multipart.encoder import MultipartEncoder
groupId = "your workspace ID"
reportName = "reportName that you choose to appear on the server"
accessToken = "xx"
url = 'https://api.powerbi.com/v1.0/myorg/groups/' + groupId + '/imports?datasetDisplayName=' + reportName
headers = {
'Content-Type': 'multipart/form-data',
'authorization': 'Bearer ' + accessToken
}
file_location = '/xx.pbix'
# you need this dictionary to convert a binary file into form-data format
# None here means we skip the filename and file content is important
files = {'value': (None, open(file_location, 'rb'), 'multipart/form-data')}
mp_encoder = MultipartEncoder(fields=files)
r = requests.post(
url=url,
data=mp_encoder, # The MultipartEncoder is posted as data, don't use files=...!
# The MultipartEncoder provides the content-type header with the boundary:
headers=headers
)
I figured out what I did wrong. Apparently you need a datasetDisplayName which is part of the url.
Therefore this problem can be solved by appending the datasetDisplayName field to the url like this:
url: 'https://api.powerbi.com/v1.0/myorg/groups/' + groupId + '/imports?datasetDisplayName=' + reportName
If you have recently started exploring Fabric, we'd love to hear how it's going. Your feedback can help with product improvements.
A new Power BI DataViz World Championship is coming this June! Don't miss out on submitting your entry.
Experience the highlights from FabCon & SQLCon, available live and on-demand starting April 14th.
| User | Count |
|---|---|
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 |
| User | Count |
|---|---|
| 8 | |
| 8 | |
| 4 | |
| 3 | |
| 2 |