封装的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