iOfficeAI/OfficeCLI · error · ArgumentException
Only base64-encoded data URIs are supported
Error message
Only base64-encoded data URIs are supported
What it means
Thrown by FileSource.ResolveDataUri when the data URI header (the part before the comma) does not contain 'base64'. The resolver only supports base64-encoded data URIs; raw/URL-encoded payloads are rejected.
Source
Thrown at src/officecli/Core/FileSource.cs:138
{
var mime = response.Content.Headers.ContentType?.MediaType;
ext = MimeToExtension(mime);
}
return (new MemoryStream(bytes), ext);
}
private static (MemoryStream, string) ResolveDataUri(string dataUri)
{
var commaIdx = dataUri.IndexOf(',');
if (commaIdx < 0)
throw new ArgumentException("Invalid data URI: missing comma separator");
var header = dataUri[..commaIdx];
var data = dataUri[(commaIdx + 1)..];
if (!header.Contains("base64", StringComparison.OrdinalIgnoreCase))
throw new ArgumentException("Only base64-encoded data URIs are supported");
var mimeStart = header.IndexOf(':') + 1;
var mimeEnd = header.IndexOf(';');
var mime = mimeEnd > mimeStart ? header[mimeStart..mimeEnd] : header[mimeStart..];
var ext = MimeToExtension(mime);
return (new MemoryStream(Convert.FromBase64String(data)), ext);
}
private static string MimeToExtension(string? mime)
{
if (string.IsNullOrEmpty(mime)) return "";
return mime.ToLowerInvariant() switch
{
// Video
"video/mp4" => ".mp4",
"video/quicktime" => ".mov",
"video/x-msvideo" or "video/avi" => ".avi",View on GitHub (pinned to 1ced45e900)
Solutions
- Encode the payload as base64 and include ';base64' in the header.
- Use a helper that produces base64 data URIs (e.g. Convert.ToBase64String then prefix).
- If the file is local, pass the filesystem path instead of a data URI.
Example fix
// before
FileSource.Resolve("data:image/png,%89PNG..."); // URL-encoded, not base64
// after
FileSource.Resolve($"data:image/png;base64,{Convert.ToBase64String(bytes)}"); Defensive patterns
Strategy: validation
Validate before calling
static string ToBase64DataUri(byte[] bytes, string mime = "application/octet-stream")
=> $"data:{mime};base64,{Convert.ToBase64String(bytes)}"; Type guard
static bool IsBase64DataUri(string s)
=> s.StartsWith("data:", StringComparison.OrdinalIgnoreCase)
&& s.AsSpan(0, s.IndexOf(',')).Contains(";base64", StringComparison.OrdinalIgnoreCase); Try / catch
try { var r = FileSource.Resolve(dataUri); }
catch (ArgumentException ex) when (ex.Message.Contains("base64-encoded"))
{ /* re-encode payload as base64 */ } Prevention
- Always emit ';base64' in data-URI headers.
- Use a builder helper rather than hand-formatting.
When it happens
Trigger: Calling FileSource.Resolve with a 'data:' URI whose header lacks the ';base64' marker, e.g. 'data:image/png,XYZ' (URL-encoded). The header is checked case-insensitively for 'base64'.
Common situations: Pasting a URL-encoded (non-base64) data URI from a browser/tool; generating a data URI without requesting base64 output; assuming raw text payloads are accepted.
Related errors
- Invalid data URI: missing comma separator
- Only base64-encoded data URIs are supported
- Invalid data URI: empty base64 payload (would produce a 0-by
- File source cannot be empty
- Invalid data URI: missing comma separator
AI-assisted analysis of iOfficeAI/OfficeCLI@1ced45e900 (2026-08-13).
Data as JSON: /api/errors/62a689d5b2f0f7bb.
Report an issue: GitHub.