I lost an afternoon to this one, so here it is in case it saves someone else the same trip.
The setup is an on-prem Power BI Report Server, fully patched, running the May 2026 release (1.26.9637.31070, build 15.0.1121.109). I had a report I needed to publish, but first I had to swap a whole batch of connection strings. Doing that by hand in Desktop is miserable, so I took a shortcut that turned out to be the root of all my pain. More on that below.
The error
When I tried to upload the pbix through the portal, all I got was this:
An error has occurred. There was an error uploading your .pbix file. Verify that the file has not been corrupted and that the file extension matches the format of the file.
Which is about as helpful as a shrug. The file wasn’t corrupt. It opened cleanly in the Report Server version of Power BI Desktop. The extension was fine. So the message sends you looking in entirely the wrong direction.
What the log actually said
The real story was in RSPowerBI.log (under ...\PBIRS\LogFiles). Every upload attempt ended the same way:
ERROR|Failure in reportproperties | System.ArgumentNullException: Value cannot be null.
Parameter name: s
at System.IO.StringReader..ctor(String s)
at Newtonsoft.Json.Linq.JObject.Parse(String json, JsonLoadSettings settings)
at Microsoft.PowerBI.ReportServer.PbixLib.Parsing.PbixParserV1.GetReportDocumentFromPowerBIPackage(IPowerBIPackage powerBIPackage)
at Microsoft.PowerBI.ReportServer.PbixLib.Parsing.PbixParserV1.ParsePbixFileIntoParts(Stream pbixFileAsStream, String requestId, String sessionId, Boolean areCustomVisualsEnabled)
at Microsoft.PowerBI.ReportServer.PbixLib.Parsing.PbixParserV1.ParsePbixFileIntoParts(Stream pbixFileAsStream, String requestId, String sessionId)
at Microsoft.PowerBI.ReportServer.WebApi.PbiApi.PbiApiController.<ShredFromStream>d__39.MoveNext()
Worth noting what comes just before this in the log: the data model loads without a hitch (LoadDatabaseAsync: Successfully EnsureDbLoaded ... modelId=...). So the server can read the model just fine. It falls over a step later, on the report layout.
GetReportDocumentFromPowerBIPackage asks the package for its single Layout document, gets null back, hands that null to JObject.Parse, and the whole thing throws. The server returns a 400, and the portal translates that into the generic “corrupted file” message you saw above.
How I got here
This is the part where I admit it was self-inflicted.
I needed to script those connection-string changes, so I moved the pbix to a machine with the regular (Store) Power BI Desktop and converted it to the enhanced report format (PBIR). That gives you a folder of JSON you can edit programmatically instead of one opaque Layout blob. Did the edits, saved back to pbix, job done. Or so I thought.
The problem is that a PBIR report has no single Layout document. It has a Report\definition\ folder with report.json and a page structure. The Report Server parser (PbixParserV1) still expects the classic single Layout file. When it doesn’t find one, you get the null, and the upload dies. This is not a version mismatch, by the way. Server and RS Desktop are both on the same May 2026 build. The format inside the file is the issue, not the build that wrote it.
What I tried (and what didn’t work)
A few things, in order:
Confirmed the builds matched. Server and Report Server Desktop are identical releases, so the usual “report was created with a newer version of Desktop” cause was off the table.
Turned PBIR back off and re-saved. In Desktop, under Options > Preview features, I unchecked Power BI Project (.pbip) save option and Store PBIX reports using enhanced metadata format (PBIR), then did a fresh Save As to a new pbix. The theory being that Desktop would serialise the report back to a classic Layout.
Verified instead of trusting it. A pbix is just a zip. So I copied the new file, renamed it to .zip, and looked inside. If there is a Report\Layout file, you are classic and good to go. If you still see a Report\definition\ folder, you are still PBIR and the upload will keep failing. Mine still had the definition folder. The downgrade simply did not take.
Looked for a pre-PBIR backup. There wasn’t one. The only copy I had was the PBIR version. That is the part that actually hurt.
Where I landed
So, no clever fix. I am rebuilding the report from scratch against the same model. Annoying, but at least it is a known quantity now.
Two things I am taking away from this:
Keep PBIR well away from anything that has to land on Report Server. The scripting convenience is real, but the parser on the server side does not read that format, and a Save As does not reliably flatten it back.
And keep a classic pbix copy before you convert anything. Five seconds of “save a backup first” would have turned a rebuild into a non-event.
If anyone has actually managed to get a PBIR report flattened back to a classic Layout that uploads, I would love to hear how. For now, I am doing it the slow way.
