部署Azure Function时斜杠被转成%2F致文件存储访问失败
问题
本地运行的Azure Function可通过ShareClient递归访问Azure文件存储的folder_1/subfolder_1子目录,但部署到云端后,请求URL中的斜杠被编码为%2F(如https://nameofaccount.file.core.windows.net/sharename/folder_1%2Fsubfolder_1),触发目录不存在的报错。
解决方案
方法1:使用ShareDirectoryClient处理目录层级
通过SDK提供的目录客户端对象来管理路径,避免手动拼接字符串导致的编码错误:
from azure.storage.fileshare import ShareClient, ShareDirectoryClient import os def main(): share_client = ShareClient.from_share_url(share_url=os.environ['STACC_URL'], credential=os.environ['STACC_KEY']) # 获取目标子目录的客户端实例 target_dir_client = share_client.get_directory_client('folder_1/subfolder_1') for file in get_files(target_dir_client): print(file) def get_files(dir_client: ShareDirectoryClient): for item in dir_client.list_directories_and_files(): if item.is_directory: # 获取子目录的客户端实例 sub_dir_client = dir_client.get_subdirectory_client(item.name) yield from get_files(sub_dir_client) else: # 拼接完整路径(可按需调整输出格式) yield f"{dir_client.path}/{item.name}"
这种方式让SDK内部处理路径编码逻辑,完全适配Azure文件存储的API要求。
方法2:用os.path.join生成标准路径
如果继续使用ShareClient的list_directories_and_files方法,改用os.path.join拼接路径,让SDK自动处理编码:
from azure.storage.fileshare import ShareClient import os def main(): share_client = ShareClient.from_share_url(share_url=os.environ['STACC_URL'], credential=os.environ['STACC_KEY']) for file in get_files(share_client, os.path.join('folder_1', 'subfolder_1')): print(file) def get_files(share_client: ShareClient, dir_name: os.PathLike): for item in share_client.list_directories_and_files(dir_name): if item.is_directory: new_dir = os.path.join(dir_name, item.name) yield from get_files(share_client, new_dir) else: yield os.path.join(dir_name, item.name)
os.path.join会生成符合运行环境的标准路径分隔符,SDK能正确识别并处理URL编码,避免斜杠被错误转义。
方法3:校验存储账户URL格式
确认环境变量STACC_URL的格式为https://<account-name>.file.core.windows.net/<share-name>,不要在末尾添加斜杠或额外路径,防止SDK解析时出现编码冲突。
内容的提问来源于stack exchange,提问作者Jose Vega
相关产品推荐
相关产品推荐

