You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用googleapis保存含特殊字符JSON至Google Drive时遇无效参数异常

解决Google Drive API保存含特殊字符JSON文件的编码错误

问题原因

报错Invalid argument (Not a byte value at index 19: 0x17c)的核心问题出在编码方式:

  • 你用contents.codeUnits获取字符串的代码单元,这是UTF-16编码的16位值,像ż这类特殊字符的UTF-16编码是0x17C,超出了单字节范围,不符合Google Drive API要求的字节流格式。
  • Google Drive的Media对象需要的是UTF-8编码的字节流,UTF-8会把特殊字符转换成多字节的合法值,不会出现超出单字节的情况。

解决步骤

  1. 导入dart:convert包,用于UTF-8编码转换;
  2. 替换原有的编码逻辑,用utf8.encode(contents)生成UTF-8字节数组;
  3. 媒体长度要使用UTF-8字节数组的实际长度,而不是原字符串的长度(因为特殊字符在UTF-8中占多个字节)。

修改后的代码

import 'dart:convert'; // 新增UTF-8编码所需的包
import 'package:googleapis/drive/v3.dart' as drive;

drive.DriveApi driveApi = await _getDriveApi();

String contents = await readJson();

// 替换原有的mediaStream和media初始化代码
final List<int> utf8Bytes = utf8.encode(contents);
final Stream<List<int>> mediaStream = Future.value(utf8Bytes).asStream().asBroadcastStream();
var media = drive.Media(mediaStream, utf8Bytes.length);

final response = await driveApi.files.create(driveFile, uploadMedia: media);

...

Future<drive.DriveApi?> _getDriveApi() async {
    final _googleSignIn = signIn.GoogleSignIn.standard(scopes: [drive.DriveApi.driveFileScope,]); 
    final signIn.GoogleSignInAccount? account = await _googleSignIn.signIn();

    final headers = await account?.authHeaders;
    if (headers == null) {
      return null;
    }

    final client = GoogleAuthClient(headers);
    final driveApi = drive.DriveApi(client);
    return driveApi;
}

说明

修改后,包含ąćęśżźół这类特殊字符的JSON内容会被正确编码为UTF-8字节流,上传到Google Drive时不会再触发编码错误,同时能保证文件内容的完整正确性。

内容的提问来源于stack exchange,提问作者hx_bunia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 07:52:41