又拍云Java SDK使用
in 第三方集成 with 3 comment

又拍云Java SDK使用

in 第三方集成 with 3 comment

上周写了一个项目,用到了图片上传和存储,使用的是又拍云的云存储,本文记录一下接入的流程和一些注意事项。

接入

又拍云 Java SDK:https://github.com/upyun/java-sdk

pom 文件中引入依赖:

<dependency>
  <groupId>com.upyun</groupId>
  <artifactId>java-sdk</artifactId>
  <version>4.2.0</version>
</dependency>

使用

初始化 RestManager

RestManager manager = new RestManager("空间名称", "操作员名称", "操作员密码");

其中,空间名称即为云存储的「服务名称」。

上传文件

public Response writeFile(String filePath, byte[] data, Map<String, String> params)
public Response writeFile(String filePath, File file, Map<String, String> params)
public Response writeFile(String filePath, InputStream inputStream, Map<String, String> params)

返回结果

Response response = manager.writeFile(filePath, file, params);

如果 response.isSuccessful() 为 true,则表示上传成功,通过又拍云绑定的域名 + 定义文件的路径 即可访问文件。例如我的 filePath 是 /test/1.jpg,又拍云绑定的域名是 https://cdn.juemuren4449.com,那么文件的链接即为 https://cdn.juemuren4449.com/test/1.jpg

关于更多上传和其他操作可以参考: java-sdk README.MD

遇到的问题

如果上传有错误,可以通过查看 response.code() 对照下面的错误码表进行问题排查。

API 错误码表:http://docs.upyun.com/api/errno/#api

filePath 问题

第一次上传的时候,我的 filePath 只写了目录名 /test,运行之后报错为 406。然后我才明白,这个 filePath 其实说白了就是把文件放到又拍云的目录加文件名,例如 /test/1.jpg,就是 test 目录下的 1.jpg 文件,文件路径的后缀要和文件的后缀一致。

编码问题

我传输的文件是图片,且不会重复,所以我直接把 file.getName() 作为文件名,测试的时候一切正常,但是程序在 Windows 下会提示 path encoding should be utf8,错误码是 40000030。

最后通过 URLEncoder.encode(file.getName(), "UTF-8")) 解决了问题,如果文件名有特殊字符,也推荐先进行 encode。当然,也可以自定义文件名。

文件覆盖问题

若空间内指定目录已存在相同文件,则会被覆盖,且不可逆。

上传的时候要特别注意,官方推荐可以通过获取文件信息来判断是否已存在相同文件,我个人认为如果对文件名没有要求,可以使用 UUID 或者 MD5 作为文件名,也可以避免文件名重复。

更多各语言版本的 SDK 请查看:「存储 & 处理 SDK」。

相关阅读:

个人博客图片存储推荐--又拍云

3评论
  • 城南牧野

    兄弟你好,想请教个问题。
    我整了个又拍云的联盟的云存储,问题是这样的,假设我的博客上传图片都上传到到我绑定到又拍云的子域xyz.wuse.ink上后,如果有一天我不想用云存储了或者又拍云完蛋了,那我博客wuse.ink涉及到有图片的文章那肯定就全不显示了。
    这个问题有何解?难道要把图片重新传回到我的主机上?十几二十篇文章还好说,上百几百篇重新修改会累死的吧 哈哈。还是说我保持子域名不变,绑定到我主机上,然后把所有的保持原有上传文件名的图片,传到这个子域名下,这样倒是不用修改文章了,可似乎也是有一点点的小麻烦,平时多备份倒不是问题,可我总觉得这还是个笨方法,有没有先进易操作些呢?

    谢谢!OωO

    • 掘墓人 博主

      @城南牧野 基本跟你最后说的一样,整个图片目录传到你的主机或者其他云存储服务,然后重新绑定域名。整体也没有多复杂,无非就是下载图片,然后上传图片,再绑定域名。

      • 城南牧野

        @掘墓人 好的,谢谢兄弟!
        我刚才买了个插件,可以在主机、本地、云存储互相倒腾文件的,后来花完钱了我又想了想,还是自主的勤备份更好一些,好习惯,还省钱。那个插件好像还有点问题,在我后台不显示,可能是配置文件的问题,已经工单给阿里了,不知道能不能解决呢。