Azure-sdk-for-java: ShareFileClient renvoie 404 lors de la récupération des propriétés lorsque le nom de fichier contient des caractères tréma

Créé le 23 avr. 2020  ·  4Commentaires  ·  Source: Azure/azure-sdk-for-java

Si le nom de fichier contient des caractères umalt (par exemple ü), ShareFileClient renvoie le code d'état 404 lors de la récupération des propriétés.

Extrait de code


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())

Dépendance Maven:

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

Exception ou trace de pile
~ stacktracecom.azure.core.exception.HttpResponseException: Code d'état 404, (corps vide)à java.base / jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0 (Méthode native) ~ [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]sur reacteur.core.publisher.MonoDefer.subscribe (MonoDefer.java:44) ~ [reacteur-coeur-3.3.2.RELEASE.jar! /: 3.3.2.RELEASE]sur reacteur.core.publisher.Mono.subscribe (Mono.java:4105) ~ [reacteur-core-3.3.2.RELEASE.jar! /: 3.3.2.RELEASE]sur reacteur.core.publisher.FluxSwitchIfEmpty $ SwitchIfEmptySubscriber.onComplete (FluxSwitchIfEmpty.java:75) ~ [reacteur-core-3.3.2.RELEASE.jar! /: 3.3.2.RELEASE]sur reacteur.core.publisher.MonoFlatMap $ FlatMapMain.onComplete (MonoFlatMap.java:174) ~ [reacteur-core-3.3.2.RELEASE.jar! /: 3.3.2.RELEASE]sur reacteur.core.publisher.Operators $ MonoSubscriber.onComplete (Operators.java:1679) ~ [reacteur-core-3.3.2.RELEASE.jar! /: 3.3.2.RELEASE]sur reacteur.core.publisher.MonoCacheTime $ CoordinatorSubscriber.signalCached (MonoCacheTime.java:326) ~ [reacteur-core-3.3.2.RELEASE.jar! /: 3.3.2.RELEASE]sur reacteur.core.publisher.MonoCacheTime $ CoordinatorSubscriber.onComplete (MonoCacheTime.java:351) ~ [reacteur-core-3.3.2.RELEASE.jar! /: 3.3.2.RELEASE]sur reacteur.core.publisher.MonoFlatMap $ FlatMapMain.onNext (MonoFlatMap.java:141) ~ [reacteur-core-3.3.2.RELEASE.jar! /: 3.3.2.RELEASE]sur reacteur.core.publisher.FluxMapFuseable $ MapFuseableSubscriber.onNext (FluxMapFuseable.java:121) ~ [reacteur-core-3.3.2.RELEASE.jar! /: 3.3.2.RELEASE]sur reacteur.core.publisher.FluxMapFuseable $ MapFuseableSubscriber.onNext (FluxMapFuseable.java:121) ~ [reacteur-core-3.3.2.RELEASE.jar! /: 3.3.2.RELEASE]sur reacteur.core.publisher.Operators $ MonoSubscriber.complete (Operators.java:1637) ~ [reacteur-core-3.3.2.RELEASE.jar! /: 3.3.2.RELEASE]sur reacteur.core.publisher.MonoCollect $ CollectSubscriber.onComplete (MonoCollect.java:160) ~ [reacteur-core-3.3.2.RELEASE.jar! /: 3.3.2.RELEASE]sur reacteur.core.publisher.FluxMapFuseable $ MapFuseableSubscriber.onComplete (FluxMapFuseable.java:144) ~ [reacteur-core-3.3.2.RELEASE.jar! /: 3.3.2.RELEASE]sur reacteur.core.publisher.FluxReplay $ UnboundedReplayBuffer.replayNormal (FluxReplay.java:551) ~ [reacteur-core-3.3.2.RELEASE.jar! /: 3.3.2.RELEASE]sur reacteur.core.publisher.FluxReplay $ UnboundedReplayBuffer.replay (FluxReplay.java:654) ~ [reacteur-core-3.3.2.RELEASE.jar! /: 3.3.2.RELEASE]sur reacteur.core.publisher.FluxReplay.subscribeOrReturn (FluxReplay.java:1096) ~ [reacteur-core-3.3.2.RELEASE.jar! /: 3.3.2.RELEASE]sur reacteur.core.publisher.FluxReplay.subscribe (FluxReplay.java:1064) ~ [reacteur-core-3.3.2.RELEASE.jar! /: 3.3.2.RELEASE]sur reacteur.core.publisher.FluxAutoConnectFuseable.subscribe (FluxAutoConnectFuseable.java:60) ~ [reacteur-core-3.3.2.RELEASE.jar! /: 3.3.2.RELEASE]sur reacteur.core.publisher.InternalMonoOperator.subscribe (InternalMonoOperator.java:55) ~ [reacteur-core-3.3.2.RELEASE.jar! /: 3.3.2.RELEASE]sur reacteur.core.publisher.MonoDefer.subscribe (MonoDefer.java:52) ~ [reacteur-core-3.3.2.RELEASE.jar! /: 3.3.2.RELEASE]sur reacteur.core.publisher.MonoCacheTime.subscribeOrReturn (MonoCacheTime.java:132) ~ [reacteur-core-3.3.2.RELEASE.jar! /: 3.3.2.RELEASE]sur reacteur.core.publisher.InternalMonoOperator.subscribe (InternalMonoOperator.java:48) ~ [reacteur-core-3.3.2.RELEASE.jar! /: 3.3.2.RELEASE]sur reacteur.core.publisher.MonoFlatMap $ FlatMapMain.onNext (MonoFlatMap.java:150) ~ [reacteur-core-3.3.2.RELEASE.jar! /: 3.3.2.RELEASE]sur reacteur.core.publisher.FluxMapFuseable $ MapFuseableSubscriber.onNext (FluxMapFuseable.java:121) ~ [réacteur-core-3.3.2.RELEASE.jar! /: 3.3.2.RELEASE]sur reacteur.core.publisher.FluxMapFuseable $ MapFuseableSubscriber.onNext (FluxMapFuseable.java:121) ~ [reacteur-core-3.3.2.RELEASE.jar! /: 3.3.2.RELEASE]sur reacteur.core.publisher.Operators $ MonoSubscriber.complete (Operators.java:1637) ~ [reacteur-core-3.3.2.RELEASE.jar! /: 3.3.2.RELEASE]sur reacteur.core.publisher.MonoCollect $ CollectSubscriber.onComplete (MonoCollect.java:160) ~ [reacteur-core-3.3.2.RELEASE.jar! /: 3.3.2.RELEASE]sur reacteur.core.publisher.FluxMapFuseable $ MapFuseableSubscriber.onComplete (FluxMapFuseable.java:144) ~ [reacteur-core-3.3.2.RELEASE.jar! /: 3.3.2.RELEASE]sur reacteur.core.publisher.FluxReplay $ UnboundedReplayBuffer.replayNormal (FluxReplay.java:551) ~ [reacteur-core-3.3.2.RELEASE.jar! /: 3.3.2.RELEASE]sur reacteur.core.publisher.FluxReplay $ UnboundedReplayBuffer.replay (FluxReplay.java:654) ~ [reacteur-core-3.3.2.RELEASE.jar! /: 3.3.2.RELEASE]sur reacteur.core.publisher.FluxReplay $ ReplaySubscriber.onComplete (FluxReplay.java:1218) ~ [reacteur-core-3.3.2.RELEASE.jar! /: 3.3.2.RELEASE]sur reacteur.core.publisher.FluxMap $ MapSubscriber.onComplete (FluxMap.java:136) ~ [reacteur-core-3.3.2.RELEASE.jar! /: 3.3.2.RELEASE]sur reacteur.core.publisher.FluxDoFinally $ DoFinallySubscriber.onComplete (FluxDoFinally.java:138) ~ [reacteur-core-3.3.2.RELEASE.jar! /: 3.3.2.RELEASE]sur reacteur.core.publisher.FluxMap $ MapSubscriber.onComplete (FluxMap.java:136) ~ [reacteur-core-3.3.2.RELEASE.jar! /: 3.3.2.RELEASE]sur reacteur.netty.channel.FluxReceive.terminateReceiver (FluxReceive.java:419) ~ [reacteur-netty-0.9.4.RELEASE.jar! /: 0.9.4.RELEASE]sur reacteur.netty.channel.FluxReceive.drainReceiver (FluxReceive.java:209) ~ [reacteur-netty-0.9.4.RELEASE.jar! /: 0.9.4.RELEASE]sur reacteur.netty.channel.FluxReceive.onInboundComplete (FluxReceive.java:367) ~ [reacteur-netty-0.9.4.RELEASE.jar! /: 0.9.4.RELEASE]sur reacteur.netty.channel.ChannelOperations.onInboundComplete (ChannelOperations.java:363) ~ [reacteur-netty-0.9.4.RELEASE.jar! /: 0.9.4.RELEASE]sur reacteur.netty.channel.ChannelOperations.terminate (ChannelOperations.java:412) ~ [reacteur-netty-0.9.4.RELEASE.jar! /: 0.9.4.RELEASE]sur reacteur.netty.http.client.HttpClientOperations.onInboundNext (HttpClientOperations.java:572) ~ [reacteur-netty-0.9.4.RELEASE.jar! /: 0.9.4.RELEASE]sur reacteur.netty.channel.ChannelOperationsHandler.channelRead (ChannelOperationsHandler.java:90) ~ [reacteur-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]Supprimé: java.lang.Exception: #block s'est terminé avec une erreursur reacteur.core.publisher.BlockingSingleSubscriber.blockingGet (BlockingSingleSubscriber.java:99) ~ [reacteur-core-3.3.2.RELEASE.jar! /: 3.3.2.RELEASE]sur reacteur.core.publisher.Mono.block (Mono.java:1663) ~ [reacteur-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 (Source inconnue) ~ [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 cadres communs omis~

Azure.Core Storage customer-reported question

Tous les 4 commentaires

J'arrive à obtenir les propriétés du fichier en utilisant curl:

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

Il est également possible d'utiliser le nom de fichier encodé pr% C3% BCffung.txt
Semble que le chemin d'encodage du client n'est pas correctement.

@valmol. Je suis capable de reproduire cela. Merci de l'avoir signalé. Il semble que le sdk encode le nom en pr% fcffung.txt. En utilisant la fonction UrlEncoder de Google (c'est-à-dire en recherchant simplement "url encoder" sur google), le décodage de cette valeur donne le nom du fichier d'origine, mais le recodage donne ce que vous avez partagé. Ce qui est intéressant.

@alzimmermsft Nous laissons le codage au core pour les partages de fichiers, et il semble que nous finissions par appeler PercentEscaper du core. Pouvez-vous jeter un oeil, s'il vous plaît?

Cela peut être lié à ce problème (https://github.com/Azure/azure-sdk-for-java/issues/10216), où les caractères japonais n'étaient pas gérés correctement lors de l'encodage. Ce PR (https://github.com/Azure/azure-sdk-for-java/pull/10273) a été soumis pour mieux gérer le pourcentage d'encodage UTF-8 caractères, je pense que cela devrait résoudre le problème vu ici. Je vérifierai que le PR mentionné résout ce problème.

Confirmé que cela est effectivement résolu par # 10273, j'ai réussi à créer un fichier avec le nom prüffung.txt sans aucun encodage manuel.

Cette page vous a été utile?
0 / 5 - 0 notes