Azure-sdk-for-java: 当文件名包含变音符号时,ShareFileClient在检索属性时返回404

创建于 2020-04-23  ·  4评论  ·  资料来源: Azure/azure-sdk-for-java

如果文件名包含Ultalt字符(例如ü),则ShareFileClient在检索属性时将返回404状态代码。

代码段


ShareFileClient fileShareClient = ShareFileClientBuilder()
                .endpoint(String.format("https://%s.file.core.windows.net", storageProperties.getAccount()))
                .credential(new StorageSharedKeyCredential(storageProperties.getAccount(), storageProperties.getKey()))
                .shareName(storageProperties.getShare())
                .resourcePath("share/prüffung.txt")
                .buildFileClient();

System.out.println(fileClient.getProperties().getContentLength())

Maven依赖项:

        <dependency>
            <groupId>com.azure</groupId>
            <artifactId>azure-storage-file-share</artifactId>
            <version>12.4.0</version>
        </dependency>

异常或堆栈跟踪
〜stacktracecom.azure.core.exception.HttpResponseException:状态码404,(空主体)在java.base / jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)〜[na:na]在java.base / jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)〜[na:na]在java.base / jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)〜[na:na]在java.base / java.lang.reflect.Constructor.newInstance(Constructor.java:490)〜[na:na]在com.azure.core.http.rest.RestProxy.instantiateUnexpectedException(RestProxy.java:357)〜[azure-core-1.2.0.jar!/:na]在com.azure.core.http.rest.RestProxy.lambda $ ensureExpectedStatus $ 4(RestProxy.java:411)〜[azure-core-1.2.0.jar!/:na]在reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:44)〜[reactor-core-3.3.2.RELEASE.jar!/:3.3.2.RELEASE]在reactor.core.publisher.Mono.subscribe(Mono.java:4105)〜[reactor-core-3.3.2.RELEASE.jar!/:3.3.2.RELEASE]在react.core.publisher.FluxSwitchIfEmpty $ SwitchIfEmptySubscriber.onComplete(FluxSwitchIfEmpty.java:75)〜[reactor-core-3.3.2.RELEASE.jar!/:3.3.2.RELEASE]在Reactor.core.publisher.MonoFlatMap $ FlatMapMain.onComplete(MonoFlatMap.java:174)〜[reactor-core-3.3.2.RELEASE.jar!/:3.3.2.RELEASE]在react.core.publisher.Operators $ MonoSubscriber.onComplete(Operators.java:1679)〜[reactor-core-3.3.2.RELEASE.jar!/:3.3.2.RELEASE]在react..core.publisher.MonoCacheTime $ CoordinatorSubscriber.signalCached(MonoCacheTime.java:326)〜[reactor-core-3.3.2.RELEASE.jar!/:3.3.2.RELEASE]中在react..core.publisher.MonoCacheTime $ CoordinatorSubscriber.onComplete(MonoCacheTime.java:351)〜[reactor-core-3.3.2.RELEASE.jar!/:3.3.2.RELEASE]中在Reactor.core.publisher.MonoFlatMap $ FlatMapMain.onNext(MonoFlatMap.java:141)〜[reactor-core-3.3.2.RELEASE.jar!/:3.3.2.RELEASE]在react..core.publisher.FluxMapFuseable $ MapFuseableSubscriber.onNext(FluxMapFuseable.java:121)〜[reactor-core-3.3.2.RELEASE.jar!/:3.3.2.RELEASE]在react..core.publisher.FluxMapFuseable $ MapFuseableSubscriber.onNext(FluxMapFuseable.java:121)〜[reactor-core-3.3.2.RELEASE.jar!/:3.3.2.RELEASE]在react..core.publisher.Operators $ MonoSubscriber.complete(Operators.java:1637)〜[reactor-core-3.3.2.RELEASE.jar!/:3.3.2.RELEASE]中在Reactor.core.publisher.MonoCollect $ CollectSubscriber.onComplete(MonoCollect.java:160)〜[reactor-core-3.3.2.RELEASE.jar!/:3.3.2.RELEASE]在Reactor.core.publisher.FluxMapFuseable $ MapFuseableSubscriber.onComplete(FluxMapFuseable.java:144)〜[reactor-core-3.3.2.RELEASE.jar!/:3.3.2.RELEASE]在Reactor.core.publisher.FluxReplay $ UnboundedReplayBuffer.replayNormal(FluxReplay.java:551)〜[reactor-core-3.3.2.RELEASE.jar!/:3.3.2.RELEASE]在Reactor.core.publisher.FluxReplay $ UnboundedReplayBuffer.replay(FluxReplay.java:654)〜[reactor-core-3.3.2.RELEASE.jar!/:3.3.2.RELEASE]在reactor.core.publisher.FluxReplay.subscribeOrReturn(FluxReplay.java:1096)〜[reactor-core-3.3.2.RELEASE.jar!/:3.3.2.RELEASE]在reactor.core.publisher.FluxReplay.subscribe(FluxReplay.java:1064)〜[reactor-core-3.3.2.RELEASE.jar!/:3.3.2.RELEASE]在react..core.publisher.FluxAutoConnectFuseable.subscribe(FluxAutoConnectFuseable.java:60)〜[reactor-core-3.3.2.RELEASE.jar!/:3.3.2.RELEASE]在reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:55)〜[reactor-core-3.3.2.RELEASE.jar!/:3.3.2.RELEASE]在reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)〜[reactor-core-3.3.2.RELEASE.jar!/:3.3.2.RELEASE]在reactor.core.publisher.MonoCacheTime.subscribeOrReturn(MonoCacheTime.java:132)〜[reactor-core-3.3.2.RELEASE.jar!/:3.3.2.RELEASE]在reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:48)〜[reactor-core-3.3.2.RELEASE.jar!/:3.3.2.RELEASE]在Reactor.core.publisher.MonoFlatMap $ FlatMapMain.onNext(MonoFlatMap.java:150)〜[reactor-core-3.3.2.RELEASE.jar!/:3.3.2.RELEASE]在react..core.publisher.FluxMapFuseable $ MapFuseableSubscriber.onNext(FluxMapFuseable.java:121)〜[reactor-core-3.3.2.RELEASE.jar!/:3.3.2.RELEASE]在react..core.publisher.FluxMapFuseable $ MapFuseableSubscriber.onNext(FluxMapFuseable.java:121)〜[reactor-core-3.3.2.RELEASE.jar!/:3.3.2.RELEASE]在react..core.publisher.Operators $ MonoSubscriber.complete(Operators.java:1637)〜[reactor-core-3.3.2.RELEASE.jar!/:3.3.2.RELEASE]中在Reactor.core.publisher.MonoCollect $ CollectSubscriber.onComplete(MonoCollect.java:160)〜[reactor-core-3.3.2.RELEASE.jar!/:3.3.2.RELEASE]在Reactor.core.publisher.FluxMapFuseable $ MapFuseableSubscriber.onComplete(FluxMapFuseable.java:144)〜[reactor-core-3.3.2.RELEASE.jar!/:3.3.2.RELEASE]在Reactor.core.publisher.FluxReplay $ UnboundedReplayBuffer.replayNormal(FluxReplay.java:551)〜[reactor-core-3.3.2.RELEASE.jar!/:3.3.2.RELEASE]在Reactor.core.publisher.FluxReplay $ UnboundedReplayBuffer.replay(FluxReplay.java:654)〜[reactor-core-3.3.2.RELEASE.jar!/:3.3.2.RELEASE]在Reactor.core.publisher.FluxReplay $ ReplaySubscriber.onComplete(FluxReplay.java:1218)〜[reactor-core-3.3.2.RELEASE.jar!/:3.3.2.RELEASE]在Reactor.core.publisher.FluxMap $ MapSubscriber.onComplete(FluxMap.java:136)〜[reactor-core-3.3.2.RELEASE.jar!/:3.3.2.RELEASE]在react.core.publisher.FluxDoFinally $ DoFinallySubscriber.onComplete(FluxDoFinally.java:138)〜[reactor-core-3.3.2.RELEASE.jar!/:3.3.2.RELEASE]在Reactor.core.publisher.FluxMap $ MapSubscriber.onComplete(FluxMap.java:136)〜[reactor-core-3.3.2.RELEASE.jar!/:3.3.2.RELEASE]在react.netty.channel.FluxReceive.terminateReceiver(FluxReceive.java:419)〜[reactor-netty-0.9.4.RELEASE.jar!/:0.9.4.RELEASE]在react.netty.channel.FluxReceive.drainReceiver(FluxReceive.java:209)〜[reactor-netty-0.9.4.RELEASE.jar!/:0.9.4.RELEASE]在react.netty.channel.FluxReceive.onInboundComplete(FluxReceive.java:367)〜[reactor-netty-0.9.4.RELEASE.jar!/:0.9.4.RELEASE]在react.netty.channel.ChannelOperations.onInboundComplete(ChannelOperations.java:363)〜[reactor-netty-0.9.4.RELEASE.jar!/:0.9.4.RELEASE]在react.netty.channel.ChannelOperations.terminate(ChannelOperations.java:412)〜[reactor-netty-0.9.4.RELEASE.jar!/:0.9.4.RELEASE]在react.netty.http.client.HttpClientOperations.onInboundNext(HttpClientOperations.java:572)〜[reactor-netty-0.9.4.RELEASE.jar!/:0.9.4.RELEASE]在react.netty.channel.ChannelOperationsHandler.channelRead(ChannelOperationsHandler.java:90)〜[reactor-netty-0.9.4.RELEASE.jar!/:0.9.4.RELEASE]在io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:377)〜[netty-transport-4.1.45.Final.jar!/:4.1.45.Final]在io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:363)〜[netty-transport-4.1.45.Final.jar!/:4.1.45.Final]在io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:355)〜[netty-transport-4.1.45.Final.jar!/:4.1.45.Final]在io.netty.channel.CombinedChannelDuplexHandler $ DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436)〜[netty-transport-4.1.45.Final.jar!/:4.1.45.Final]在io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:321)〜[netty-codec-4.1.45.Final.jar!/:4.1.45.Final]在io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:295)〜[netty-codec-4.1.45.Final.jar!/:4.1.45.Final]在io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251)〜[netty-transport-4.1.45.Final.jar!/:4.1.45.Final]在io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:377)〜[netty-transport-4.1.45.Final.jar!/:4.1.45.Final]在io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:363)〜[netty-transport-4.1.45.Final.jar!/:4.1.45.Final]在io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:355)〜[netty-transport-4.1.45.Final.jar!/:4.1.45.Final]在io.netty.handler.ssl.SslHandler.unwrap(SslHandler.java:1470)〜[netty-handler-4.1.45.Final.jar!/:4.1.45.Final]在io.netty.handler.ssl.SslHandler.decodeNonJdkCompatible(SslHandler.java:1231)〜[netty-handler-4.1.45.Final.jar!/:4.1.45.Final]在io.netty.handler.ssl.SslHandler.decode(SslHandler.java:1268)〜[netty-handler-4.1.45.Final.jar!/:4.1.45.Final]在io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:498)〜[netty-codec-4.1.45.Final.jar!/:4.1.45.Final]在io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:437)〜[netty-codec-4.1.45.Final.jar!/:4.1.45.Final]在io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:276)〜[netty-codec-4.1.45.Final.jar!/:4.1.45.Final]在io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:377)〜[netty-transport-4.1.45.Final.jar!/:4.1.45.Final]在io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:363)〜[netty-transport-4.1.45.Final.jar!/:4.1.45.Final]在io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:355)〜[netty-transport-4.1.45.Final.jar!/:4.1.45.Final]在io.netty.channel.DefaultChannelPipeline $ HeadContext.channelRead(DefaultChannelPipeline.java:1410)〜[netty-transport-4.1.45.Final.jar!/:4.1.45.Final]在io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:377)〜[netty-transport-4.1.45.Final.jar!/:4.1.45.Final]在io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:363)〜[netty-transport-4.1.45.Final.jar!/:4.1.45.Final]在io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)〜[netty-transport-4.1.45.Final.jar!/:4.1.45.Final]在io.netty.channel.epoll.AbstractEpollStreamChannel $ EpollStreamUnsafe.epollInReady(AbstractEpollStreamChannel.java:792)〜[netty-transport-native-epoll-4.1.45.Final-linux-x86_64.jar!/:4.1.45.Final ]在io.netty.channel.epoll.EpollEventLoop.processReady(EpollEventLoop.java:475)〜[netty-transport-native-epoll-4.1.45.Final-linux-x86_64.jar!/:4.1.45.Final]在io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:378)〜[netty-transport-native-epoll-4.1.45.Final-linux-x86_64.jar!/:4.1.45.Final]在io.netty.util.concurrent.SingleThreadEventExecutor $ 4.run(SingleThreadEventExecutor.java:989)〜[netty-common-4.1.45.Final.jar!/:4.1.45.Final]在io.netty.util.internal.ThreadExecutorMap $ 2.run(ThreadExecutorMap.java:74)〜[netty-common-4.1.45.Final.jar!/:4.1.45.Final]在io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)〜[netty-common-4.1.45.Final.jar!/:4.1.45.Final]在java.base / java.lang.Thread.run(Thread.java:834)〜[na:na]禁止:java.lang.Exception:#block因错误终止在Reactor.core.publisher.BlockingSingleSubscriber.blockingGet(BlockingSingleSubscriber.java:99)〜[reactor-core-3.3.2.RELEASE.jar!/:3.3.2.RELEASE]在react..core.publisher.Mono.block(Mono.java:1663)〜[reactor-core-3.3.2.RELEASE.jar!/:3.3.2.RELEASE]在com.azure.storage.common.implementation.StorageImplUtils.blockWithOptionalTimeout(StorageImplUtils.java:99)〜[azure-storage-common-12.4.0.jar!/:na]在com.azure.storage.file.share.ShareFileClient.getPropertiesWithResponse(ShareFileClient.java:658)〜[azure-storage-file-share-12.2.0.jar!/:na]在com.azure.storage.file.share.ShareFileClient.getPropertiesWithResponse(ShareFileClient.java:630)〜[azure-storage-file-share-12.2.0.jar!/:na]在com.azure.storage.file.share.ShareFileClient.getProperties(ShareFileClient.java:606)〜[azure-storage-file-share-12.2.0.jar!/:na]在com.isb.bppm.whs.broker.storage.AzureStorageManager.mapToFileDescriptor(AzureStorageManager.java:126)〜[classes!/:3.0.44]在com.isb.bppm.whs.broker.storage.AzureStorageManager.lambda $ listNonLockedFiles $ 1(AzureStorageManager.java:41)〜[classes!/:3.0.44]在java.base / java.util.stream.ReferencePipeline $ 3 $ 1.accept(ReferencePipeline.java:195)〜[na:na]在java.base / java.util.stream.ReferencePipeline $ 2 $ 1.accept(ReferencePipeline.java:177)〜[na:na]在java.base / java.util.Iterator.forEachRemaining(Iterator.java:133)〜[na:na]在java.base / java.util.Spliterators $ IteratorSpliterator.forEachRemaining(Spliterators.java:1801)〜[na:na]在java.base / java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)〜[na:na]在java.base / java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)〜[na:na]在java.base / java.util.stream.ReduceOps $ ReduceOp.evaluateSequential(ReduceOps.java:913)〜[na:na]在java.base / java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)〜[na:na]在java.base / java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578)〜[na:na]在com.isb.bppm.whs.broker.storage.AzureStorageManager.listNonLockedFiles(AzureStorageManager.java:42)〜[classes!/:3.0.44]在com.isb.bppm.whs.broker.FtpFileCheckerJob.execute(FtpFileCheckerJob.java:81)〜[classes!/:3.0.44]在com.isb.bppm.whs.broker.scheduling.SchedulerGeneralJob.execute(SchedulerGeneralJob.java:45)〜[classes!/:3.0.44]在java.base / java.util.stream.ForEachOps $ ForEachOp $ OfRef.accept(ForEachOps.java:183)〜[na:na]在java.base / java.util.ArrayList $ ArrayListSpliterator.forEachRemaining(ArrayList.java:1654)〜[na:na]在java.base / java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)〜[na:na]在java.base / java.util.stream.ForEachOps $ ForEachTask.compute(ForEachOps.java:290)〜[na:na]在java.base / java.util.concurrent.CountedCompleter.exec(CountedCompleter.java:746)〜[na:na]在java.base / java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290)〜[na:na]在java.base / java.util.concurrent.ForkJoinTask.doInvoke(ForkJoinTask.java:408)〜[na:na]在java.base / java.util.concurrent.ForkJoinTask.invoke(ForkJoinTask.java:736)〜[na:na]在java.base / java.util.stream.ForEachOps $ ForEachOp.evaluateParallel(ForEachOps.java:159)〜[na:na]在java.base / java.util.stream.ForEachOps $ ForEachOp $ OfRef.evaluateParallel(ForEachOps.java:173)〜[na:na]在java.base / java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:233)〜[na:na]在java.base / java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:497)〜[na:na]在java.base / java.util.stream.ReferencePipeline $ Head.forEach(ReferencePipeline.java:661)〜[na:na]在com.isb.bppm.whs.broker.scheduling.SchedulerExecutor.performAction(SchedulerExecutor.java:29)〜[classes!/:3.0.44]在com.isb.bppm.whs.broker.scheduling.SchedulerExecutor.monitor(SchedulerExecutor.java:23)〜[classes!/:3.0.44]在jdk.internal.reflect.GeneratedMethodAccessor107.invoke(未知来源)〜[na:na]在java.base / jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)〜[na:na]在java.base / java.lang.reflect.Method.invoke(Method.java:566)〜[na:na]在org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84)〜[spring-context-5.2.3.RELEASE.jar!/:5.2.3.RELEASE]在org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)〜[spring-context-5.2.3.RELEASE.jar!/:5.2.3.RELEASE]在java.base / java.util.concurrent.Executors $ RunnableAdapter.call(Executors.java:515)〜[na:na]在java.base / java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305)〜[na:na]在java.base / java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305)〜[na:na]在java.base / java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)〜[na:na]在java.base / java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:628)〜[na:na]...省略了1个通用框架

Azure.Core Storage customer-reported question

所有4条评论

我设法使用curl获取文件属性:

curl --location --request GET 'https://<account>.file.core.windows.net/share001/prüffung.txt?sv=<sas>'

也可以使用编码文件名pr%C3%BCffung.txt
似乎客户端编码路径不正确。

@valmol。 我能够重现这一点。 感谢您举报。 看起来sdk正在将名称编码为pr%fcffung.txt。 使用Google的UrlEncoder功能(即,仅在Google上搜索“ URL编码器”),对该值进行解码即可得到原始文件名,然后对其进行重新编码就可以共享。 这很有趣。

@alzimmermsft我们将编码留给核心用于文件共享,看起来我们最终调用了核心的PercentEscaper。 你能看一下吗?

这可能与此问题有关(https://github.com/Azure/azure-sdk-for-java/issues/10216),在编码时日语字符未得到正确处理。 提交此PR(https://github.com/Azure/azure-sdk-for-java/pull/10273)可以更好地处理编码UTF-8字符的百分比,我相信这应该可以解决此处看到的问题。 我将验证上述PR是否可以解决此问题。

确认此问题确实已由#10273修复,因此我能够成功创建名称prüffung.txt的文件,而无需进行任何手动编码。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

hemanttanwar picture hemanttanwar  ·  3评论

marciopd picture marciopd  ·  3评论

dkirrane picture dkirrane  ·  4评论

Shabirmean picture Shabirmean  ·  3评论

srnagar picture srnagar  ·  4评论