问题:
桶中能正常接收到文件,但是文件出现数据损坏,控制台报错为
No content length specified for stream data. Stream contents will be buffered in memory and could result in out of memory errors.
解决办法 :
给metadata的ContentLength属性赋值所要传输文件字节流的字节数.
ObjectMetadata metadata = new ObjectMetadata(); metadata.setContentLength(byteArrayInputStream.available());
另外COS上传文件的工具类分享给大家.
@Component
@ConfigurationProperties(prefix = "tencent")
@Data
public class TencentCosProperties {
private String endpoint;
private String accessKeyId;
private String accessKeySecret;
private String bucketName;
}
=======================================================
@Configuration
@Slf4j
public class CosConfiguration {
@Bean
@ConditionalOnMissingBean
public TencentCosUtil tencentCosUtil(TencentCosProperties tencentCosProperties){
return new TencentCosUtil(
tencentCosProperties.getEndpoint(),
tencentCosProperties.getAccessKeyId(),
tencentCosProperties.getAccessKeySecret(),
tencentCosProperties.getBucketName());
}
}
=======================================================
@Data
@AllArgsConstructor
@Slf4j
public class TencentCosUtil {
private String endpoint;
private String accessKeyId;
private String accessKeySecret;
private String bucketName;
/**
* 文件上传
*
* @param bytes 文件byte数组
* @param objectName 文件名称
* @return
*/
public String upload(byte[] bytes, String objectName) {
// 创建OSSClient实例。
COSCredentials cred = new BasicCOSCredentials(accessKeyId, accessKeySecret);
Region region = new Region(com.tencentcloudapi.common.profile.Region.Guangzhou.toString());
ClientConfig clientConfig = new ClientConfig(region);
clientConfig.setHttpProtocol(HttpProtocol.https);
COSClient cosClient = new COSClient(cred, clientConfig);
String folder = "images/";
String key = folder + objectName;
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentType("image/png");
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
metadata.setContentLength(byteArrayInputStream.available());
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, byteArrayInputStream, metadata);
PutObjectResult putObjectResult = cosClient.putObject(putObjectRequest);
//文件访问路径规则 https://BucketName.Endpoint/ObjectName
StringBuilder stringBuilder = new StringBuilder("");
stringBuilder
.append(endpoint)
.append("/")
.append(key);
log.info("文件上传到:{}", stringBuilder.toString());
cosClient.shutdown();
return stringBuilder.toString();
}
}