You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

部署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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 20:33:20