huaweicloud / huaweicloud-sdk-java-obs

The OBS SDK for Java, which is used for accessing Object Storage Service
Other
131 stars 116 forks source link

copyObject: ObsException: Error message:Request Error.OBS service Error Message #156

Closed zhcosin closed 3 weeks ago

zhcosin commented 1 month ago

复制对象时报错: 业务请求对象:

{
  "sourceBucket": "sdxj",
  "sourceKey": "tmp/a/456.jpg",
  "destBucket": "sdxj",
  "destKey": "tmp/a/aaa.jpg",
  "expires": 5
}

复制代码:

public boolean copyObject(String sourceBucket, String sourceKey, String destBucket, String destKey, Integer expires) {
        try {
            CopyObjectRequest req = new CopyObjectRequest(sourceKey, sourceKey, destBucket, destKey);           
            CopyObjectResult res = s3client.copyObject(req);
            if (200 != res.getStatusCode()) {
                log.error("copy from %s in bucket %s to %s in bucket %s failed with response %d.", sourceKey, sourceBucket, destKey, destBucket, res.getStatusCode());
                return false;
            }
            return true;
        } catch (Exception e) {
            log.error(e.getMessage(),e);
            return false;
        } finally {
        }
    }

日志输出:

2024-06-14 16:04:21.568  INFO 23452 --- [nio-8080-exec-3] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2024-06-14 16:04:21.569  INFO 23452 --- [nio-8080-exec-3] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2024-06-14 16:04:21.570  INFO 23452 --- [nio-8080-exec-3] o.s.web.servlet.DispatcherServlet        : Completed initialization in 1 ms
2024-06-14 16:04:21.817  INFO 23452 --- [nio-8080-exec-3] c.o.s.internal.RestStorageService        : OkHttp cost 95 ms to apply http request
2024-06-14 16:04:21.820  WARN 23452 --- [nio-8080-exec-3] c.o.s.internal.RestStorageService        : Request failed, Response code: 404; Request ID: 17D8D0472436FA84; Request path: https://127.0.0.1/sdxj/tmp%2Fa%2Faaa.jpg
2024-06-14 16:04:21.821  WARN 23452 --- [nio-8080-exec-3] com.obs.services.AbstractClient          : Storage|1|HTTP+XML|copyObject||||2024-06-14 16:04:21|2024-06-14 16:04:21|||404|
2024-06-14 16:04:21.821  INFO 23452 --- [nio-8080-exec-3] com.obs.log.AccessLogger                 : 2024-06-14 16:04:21 818|com.obs.services.internal.RestStorageService|executeRequest|600|OkHttp cost 95 ms to apply http request
2024-06-14 16:04:21 820|com.obs.services.internal.RestStorageService|handleThrowable|220|Request failed, Response code: 404; Request ID: 17D8D0472436FA84; Request path: https://127.0.0.1/sdxj/tmp%2Fa%2Faaa.jpg
2024-06-14 16:04:21 821|com.obs.services.AbstractClient|doActionWithResult|408|Storage|1|HTTP+XML|copyObject||||2024-06-14 16:04:21|2024-06-14 16:04:21|||404|

2024-06-14 16:04:21.824 ERROR 23452 --- [nio-8080-exec-3] com.sdxj.obs_s3_test.service.S3Storage   : Error message:Request Error.OBS service Error Message.

com.obs.services.exception.ObsException: Error message:Request Error.OBS service Error Message.
        at com.obs.services.internal.utils.ServiceUtils.changeFromServiceException(ServiceUtils.java:544)
        at com.obs.services.AbstractClient.doActionWithResult(AbstractClient.java:403)
        at com.obs.services.AbstractObjectClient.copyObject(AbstractObjectClient.java:511)
        at com.sdxj.obs_s3_test.service.S3Storage.copyObject(S3Storage.java:189)
        at com.sdxj.obs_s3_test.service.S3TestService.copyObject(S3TestService.java:66)
        at com.sdxj.obs_s3_test.controller.MyController.copyFile(MyController.java:33)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
        at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)
        at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)
        at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
        at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072)
        at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965)
        at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
        at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:555)
        at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:623)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:209)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)
        at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)
        at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)
        at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)
        at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:481)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:130)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
        at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389)
        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:926)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1791)
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
        at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
        at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Thread.java:748)

看日志它提示 https://127.0.0.1/sdxj/tmp%2Fa%2Faaa.jpg 这个文件不存在(sdxj 是桶名),但是这是目标文件,代码层面检查过源和目标没有写反,我又测试了把 tmp/a/aaa.jpg 文件让它存在,浏览器打开链接 https://127.0.0.1/sdxj/tmp%2Fa%2Faaa.jpg 可以显示图片,再次复制时它仍然报这个文件不存在,所以可能是 sdk 把 tmp/a/aaa.jpg 中的左斜杠转义了导致转义后的路径 tmp%2Fa%2Faaa.jpg 在对象存储中不存在. 有人遇到过这个问题吗?

使用的 SDK 为

<dependency>
    <groupId>com.huaweicloud</groupId>
    <artifactId>esdk-obs-java-bundle</artifactId>
    <version>3.23.9</version>
</dependency>
liqiuqiu111 commented 1 month ago

/转译不会导致服务端报错,还是检查endpoint,objectkey等参数是否正确

zhcosin commented 3 weeks ago

非常抱歉,这是一个低级错误引起的。。。 问题出在下面这一行

 CopyObjectRequest req = new CopyObjectRequest(sourceKey, sourceKey, destBucket, destKey);   

正确的应该是

 CopyObjectRequest req = new CopyObjectRequest(sourceBucket, sourceKey, destBucket, destKey);   

也就是把源桶写错了。。。 抱歉浪费大家时间。。。