使用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会把特殊字符转换成多字节的合法值,不会出现超出单字节的情况。
解决步骤
- 导入
dart:convert包,用于UTF-8编码转换; - 替换原有的编码逻辑,用
utf8.encode(contents)生成UTF-8字节数组; - 媒体长度要使用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
相关产品推荐
相关产品推荐

