IaaS
腾讯云
COS 客户端:
说明 -
海外使用时,上传大于 1MiB 的文件会报 CosServiceException: User network is too slow...UserNetworkTooSlow:
台湾、东京服务器均报网慢,猜测是为了推广付费的“全球加速”服务(1.25元/GB),而劣化了境外所有上传线路,距离再近也如故,2026 年前则未劣化。
加线程也不能完全缓解: new TransferManager(_COSClient, Executors.newFixedThreadPool(8)); // GAE 平台上,应在内存充分的 B2 上先测下。
亲测配置“自定义源站域名”可解决:
_ClientConfig.setEndpointBuilder(new UserSpecifiedEndpointBuilder("cdn.example.com", "service.cos.myqcloud.com")); // 不想签发证书可 cc.setHttpProtocol(HttpProtocol.http);
预签名链接未测 - https://cloud.tencent.com/document/product/436/35217#bf54db7f-872c-4a70-871d-b21e0afd9360
服务器暂时不可用报(重试或 System.gc() 即可) - Upload canceled.
其他优化:
//_ClientConfig.setSocketTimeout(10 * 60 * 1000); // 默认30秒;解决 SocketTimeoutException。
////对齐重试标记,避免 Resetting to invalid mark:
// _ClientConfig.setReadLimit(1 * 1024 * 1024); // 默认128K;不分片则必须设置为文件总大小。
// _TransferManager.getConfiguration().setMinimumUploadPartSize(tm.getCOSClient().getClientConfig().getReadLimit()); // 分包设置;默认5MiB。
var r = HttpClient ... HttpResponse.BodyHandlers.ofInputStream() ...
var is = r.body();
if (isMemoryBytes != null) {
is = new ByteArrayInputStream(is.readAllBytes());
}
var om = new ObjectMetadata(); // [可选] 未提供则总长度为 -1。
om.setContentLength(r.headers().firstValueAsLong("Content-Length").getAsLong());
System.setProperty(SkipMd5CheckStrategy.DISABLE_PUT_OBJECT_MD5_VALIDATION_PROPERTY, "true"); // HttpClient 响应流不可重复读。
var rPut = ManageCOS.instance().cos().putObject("b", "o/path/" + path, is, om); // rPut.getContentMd5();
var tm = new TransferManager(ManageCOS.instance().cos()); // 想看进度需包裹一层高级接口
var rv = tm.upload(new PutObjectRequest("b", "o/path/" + path, is, om));
showTransferProgress(rv);
var ur = rv.waitForUploadResult(); // ur.getCrc64Ecma();