阿里云OSS文件服务文件下载使用自定义名称,并解决文件名中文乱码的问题。ObjectMetadata 和 URLEncoder.encode

作者
2024-10-15阅读 4676

封装的openservice服务中的文件服务,使用的是阿里云的oss服务。

在文件上传的时候oss对文件名做了处理。

例如:我上传的文件是“啊啊啊啊.zip”

但是我上传到oss之后的文件名则会变成“5a764053b4b848c6995c01cf77f7ce09.zip”。由于我们的系统在下载的时候直接是让客户访问阿里云oss的路径,所以下载下来的文件名自然也是一堆无意义的字符。

希望能够达到的效果是:下载的时候的文件名跟上传的文件名保持一致。

其实阿里云oss是有解决方法的,参照https://help.aliyun.com/document_detail/84840.html?spm=5176.11065259.1996646101.searchclickresult.63f5e5dedzMok9

我把其中一部分摘出来,以便直接参考

核心的东西是在文件上传的时候,设置header属性。

// 创建上传文件的元信息,可以通过文件元信息设置HTTP header。
ObjectMetadata meta = new ObjectMetadata();
// 设置内容被下载时的名称。
meta.setContentDisposition("attachment; filename=\"DownloadFilename\"");
// 设置内容被下载时的编码格式。
meta.setContentEncoding("utf-8");

// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// 上传文件。
ossClient.putObject("<yourBucketName>", "<yourObjectName>", new ByteArrayInputStream(content.getBytes()), meta);

可以看到里面主要是用到了meta.setContentDisposition("attachment; filename="DownloadFilename"");

在实际的使用过程中,出现了乱码问题。因为我上传的文件名是中文,下载下来之文件名是乱码

解决办法:将文件名进行url编码URLEncoder.encode(originalName, "utf-8")

下面是我的代码。里面的双引号记得用\"

try (InputStream inputStream = file.getInputStream()) {
    ObjectMetadata metadata = new ObjectMetadata();
    metadata.setContentDisposition("attachment;filename=\"" + URLEncoder.encode(originalName, "utf-8") + "\"");
    metadata.setContentEncoding("utf-8");
    ossClient.putObject(uploadEntity.getBucketName(), fileUploadResult.getOssObjName(), inputStream, metadata);
} catch (Exception e) {
    throw new AliOssUploadException("OSS 服务文件上传异常");
}

经过这样的处理之后,实现的效果是

下载url是:http://oss.mysite.com/5a764053b4b848c6995c01cf77f7ce09.zip?Expires=1926409129&OSSAccessKeyId=129DKE8FJ3383&Signature=0di1Uk%2B2iAwM0FVEak%3D

下载下来的文件是:啊啊啊啊.zip



全部评论

头像
乌兔
前端开发
私信
获得点赞 445
文章被阅读 31,261