{"record":{"id":"046643a3b9cc08de","repo":"iOfficeAI/OfficeCLI","slug":"only-base64-encoded-data-uris-are-supported-046643","errorCode":null,"errorMessage":"Only base64-encoded data URIs are supported","messagePattern":"Only base64-encoded data URIs are supported","errorType":"exception","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"src/officecli/Core/ImageSource.cs","lineNumber":128,"sourceCode":"        if (type == ImagePartType.Jpeg) return \"JPEG\";\n        if (type == ImagePartType.Gif) return \"GIF\";\n        if (type == ImagePartType.Bmp) return \"BMP\";\n        if (type == ImagePartType.Tiff) return \"TIFF\";\n        return type.ContentType ?? \"unknown\";\n    }\n\n    private static (Stream, PartTypeInfo) ResolveDataUri(string dataUri)\n    {\n        // Format: data:[<mediatype>][;base64],<data>\n        var commaIdx = dataUri.IndexOf(',');\n        if (commaIdx < 0)\n            throw new ArgumentException(\"Invalid data URI: missing comma separator\");\n\n        var header = dataUri[..commaIdx]; // e.g. \"data:image/png;base64\"\n        var data = dataUri[(commaIdx + 1)..];\n\n        if (!header.Contains(\"base64\", StringComparison.OrdinalIgnoreCase))\n            throw new ArgumentException(\"Only base64-encoded data URIs are supported\");\n\n        // Extract MIME type\n        var mimeStart = header.IndexOf(':') + 1;\n        var mimeEnd = header.IndexOf(';');\n        var mime = mimeEnd > mimeStart ? header[mimeStart..mimeEnd] : header[mimeStart..];\n\n        var contentType = MimeToContentType(mime);\n        var bytes = Convert.FromBase64String(data);\n        // An empty payload decodes \"successfully\" to zero bytes and would\n        // flow all the way into a 0-byte media part — schema-valid, but the\n        // picture renders broken in Word/PowerPoint. Reject up front, like\n        // the extpart carrier does for empty data.\n        if (bytes.Length == 0)\n            throw new ArgumentException(\"Invalid data URI: empty base64 payload (would produce a 0-byte image).\");\n        return (new MemoryStream(bytes), contentType);\n    }\n\n    private static (Stream, PartTypeInfo) ResolveUrl(string url)","sourceCodeStart":110,"sourceCodeEnd":146,"githubUrl":"https://github.com/iOfficeAI/OfficeCLI/blob/1ced45e900782c5083ed550ddf328ee974e425e7/src/officecli/Core/ImageSource.cs#L110-L146","documentation":"Thrown by ImageSource.ResolveDataUri when a data URI contains a comma but its header portion (the part before the comma) does not contain 'base64'. OfficeCLI only supports base64-encoded data URIs — URL-encoded (percent-encoded) data URIs are rejected because the decoder expects raw base64. The check is case-insensitive and substring-based against the header.","triggerScenarios":"Passing a data URI like 'data:image/png,%89PNG...' (URL-encoded, no ;base64 flag) or 'data:text/plain,Hello' (plain text, no ;base64). Any data URI where the header between 'data:' and ',' does not contain the substring 'base64' (case-insensitive) triggers this error.","commonSituations":"A data URI generated by a browser or tool that defaults to URL-encoding rather than base64. A data URI copied from an HTML source attribute that used percent-encoding. A user constructing a data URI manually without adding the ';base64' parameter.","solutions":["Base64-encode the image payload and add ';base64' to the data URI header: 'data:image/png;base64,<base64data>'.","Use a tool or library function to produce base64 data URIs (e.g. base64 command, or Convert.ToBase64String in C#).","If you have a URL-encoded data URI, decode it first, then re-encode as base64."],"exampleFix":"// before — URL-encoded data URI rejected\nadd image src='data:image/png,%89PNG%0D%0A...' path='/body'\n\n// after — base64-encoded data URI accepted\nadd image src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUg...' path='/body'","handlingStrategy":"validation","validationCode":"// Pre-check that data URI is base64-encoded\nif (source.StartsWith(\"data:\", StringComparison.OrdinalIgnoreCase))\n{\n    int commaIdx = source.IndexOf(',');\n    if (commaIdx > 0)\n    {\n        string header = source[..commaIdx];\n        if (!header.Contains(\"base64\", StringComparison.OrdinalIgnoreCase))\n        {\n            Console.Error.WriteLine(\"Only base64 data URIs are supported. Re-encode as base64.\");\n            return;\n        }\n    }\n}","typeGuard":null,"tryCatchPattern":"try\n{\n    var (stream, contentType) = ImageSource.Resolve(source);\n}\ncatch (ArgumentException ex) when (ex.Message.Contains(\"base64\"))\n{\n    // Re-encode the payload as base64 and retry\n}","preventionTips":["Always use ';base64' in data URIs: 'data:image/png;base64,<data>'.","Convert URL-encoded data URIs to base64 before embedding.","Use Convert.ToBase64String to generate the payload in C#."],"tags":["image","data-uri","encoding","base64","validation"],"backgroundTag":null,"analyzedSha":"1ced45e900782c5083ed550ddf328ee974e425e7","analyzedAt":"2026-08-13T13:01:07.193Z","schemaVersion":2},"datasetVersion":"2026-08-13T14:17:21.547Z"}