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~
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.