Azure-sdk-for-java: ShareFileClientは、ファイル名にウムラウト文字が含まれている場合にプロパティを取得すると404を返します

作成日 2020年04月23日  ·  4コメント  ·  ソース: Azure/azure-sdk-for-java

ファイル名にumalt文字(例:ü)が含まれている場合、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 $ sureExpectedStatus $ 4(RestProxy.java:411)〜[azure-core-1.2.0.jar!/:na]でreact.core.publisher.MonoDefer.subscribe(MonoDefer.java:44)〜[reactor-core-3.3.2.RELEASE.jar!/:3.3.2.RELEASE]react.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]react.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]でreact.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]react.core.publisher.MonoCollect $ CollectSubscriber.onComplete(MonoCollect.java:160)〜[reactor-core-3.3.2.RELEASE.jar!/:3.3.2.RELEASE]react.core.publisher.FluxMapFuseable $ MapFuseableSubscriber.onComplete(FluxMapFuseable.java:144)〜[reactor-core-3.3.2.RELEASE.jar!/:3.3.2.RELEASE]react.core.publisher.FluxReplay $ UnboundedReplayBuffer.replayNormal(FluxReplay.java:551)〜[reactor-core-3.3.2.RELEASE.jar!/:3.3.2.RELEASE]でreact.core.publisher.FluxReplay $ UnboundedReplayBuffer.replay(FluxReplay.java:654)〜[reactor-core-3.3.2.RELEASE.jar!/:3.3.2.RELEASE]でreact.core.publisher.FluxReplay.subscribeOrReturn(FluxReplay.java:1096)〜[reactor-core-3.3.2.RELEASE.jar!/:3.3.2.RELEASE]でreact.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]react.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:55)〜[reactor-core-3.3.2.RELEASE.jar!/:3.3.2.RELEASE]react.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)〜[reactor-core-3.3.2.RELEASE.jar!/:3.3.2.RELEASE]でreact.core.publisher.MonoCacheTime.subscribeOrReturn(MonoCacheTime.java:132)〜[reactor-core-3.3.2.RELEASE.jar!/:3.3.2.RELEASE]でreact.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:48)〜[reactor-core-3.3.2.RELEASE.jar!/:3.3.2.RELEASE]react.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]react.core.publisher.MonoCollect $ CollectSubscriber.onComplete(MonoCollect.java:160)〜[reactor-core-3.3.2.RELEASE.jar!/:3.3.2.RELEASE]react.core.publisher.FluxMapFuseable $ MapFuseableSubscriber.onComplete(FluxMapFuseable.java:144)〜[reactor-core-3.3.2.RELEASE.jar!/:3.3.2.RELEASE]react.core.publisher.FluxReplay $ UnboundedReplayBuffer.replayNormal(FluxReplay.java:551)〜[reactor-core-3.3.2.RELEASE.jar!/:3.3.2.RELEASE]でreact.core.publisher.FluxReplay $ UnboundedReplayBuffer.replay(FluxReplay.java:654)〜[reactor-core-3.3.2.RELEASE.jar!/:3.3.2.RELEASE]でreact.core.publisher.FluxReplay $ ReplaySubscriber.onComplete(FluxReplay.java:1218)〜[reactor-core-3.3.2.RELEASE.jar!/:3.3.2.RELEASE]react.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]react.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]でat io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:377)〜[netty-transport-4.1.45.Final.jar!/:4.1.45.Final]at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:363)〜[netty-transport-4.1.45.Final.jar!/:4.1.45.Final]at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:355)〜[netty-transport-4.1.45.Final.jar!/:4.1.45.Final]at io.netty.channel.CombinedChannelDuplexHandler $ DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436)〜[netty-transport-4.1.45.Final.jar!/:4.1.45.Final]at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:321)〜[netty-codec-4.1.45.Final.jar!/:4.1.45.Final]at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:295)〜[netty-codec-4.1.45.Final.jar!/:4.1.45.Final]at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251)〜[netty-transport-4.1.45.Final.jar!/:4.1.45.Final]at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:377)〜[netty-transport-4.1.45.Final.jar!/:4.1.45.Final]at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:363)〜[netty-transport-4.1.45.Final.jar!/:4.1.45.Final]at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:355)〜[netty-transport-4.1.45.Final.jar!/:4.1.45.Final]at io.netty.handler.ssl.SslHandler.unwrap(SslHandler.java:1470)〜[netty-handler-4.1.45.Final.jar!/:4.1.45.Final]at io.netty.handler.ssl.SslHandler.decodeNonJdkCompatible(SslHandler.java:1231)〜[netty-handler-4.1.45.Final.jar!/:4.1.45.Final]at io.netty.handler.ssl.SslHandler.decode(SslHandler.java:1268)〜[netty-handler-4.1.45.Final.jar!/:4.1.45.Final]at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:498)〜[netty-codec-4.1.45.Final.jar!/:4.1.45.Final]at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:437)〜[netty-codec-4.1.45.Final.jar!/:4.1.45.Final]at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:276)〜[netty-codec-4.1.45.Final.jar!/:4.1.45.Final]at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:377)〜[netty-transport-4.1.45.Final.jar!/:4.1.45.Final]at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:363)〜[netty-transport-4.1.45.Final.jar!/:4.1.45.Final]at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:355)〜[netty-transport-4.1.45.Final.jar!/:4.1.45.Final]at io.netty.channel.DefaultChannelPipeline $ HeadContext.channelRead(DefaultChannelPipeline.java:1410)〜[netty-transport-4.1.45.Final.jar!/:4.1.45.Final]at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:377)〜[netty-transport-4.1.45.Final.jar!/:4.1.45.Final]at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:363)〜[netty-transport-4.1.45.Final.jar!/:4.1.45.Final]at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)〜[netty-transport-4.1.45.Final.jar!/:4.1.45.Final]at 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 ]at 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]at 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]at io.netty.util.concurrent.SingleThreadEventExecutor $ 4.run(SingleThreadEventExecutor.java:989)〜[netty-common-4.1.45.Final.jar!/:4.1.45.Final]at io.netty.util.internal.ThreadExecutorMap $ 2.run(ThreadExecutorMap.java:74)〜[netty-common-4.1.45.Final.jar!/:4.1.45.Final]at 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がエラーで終了しましたreact.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 評価