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

  1. Encode the payload as base64 and include ';base64' in the header.
  2. Use a helper that produces base64 data URIs (e.g. Convert.ToBase64String then prefix).
  3. 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

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


AI-assisted analysis of iOfficeAI/OfficeCLI@1ced45e900 (2026-08-13). Data as JSON: /api/errors/62a689d5b2f0f7bb. Report an issue: GitHub.