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

船舶弱网环境下,如何通过FTP从Azure文件存储下载文件?

解决Azure文件存储通过FTP下载的问题

首先得明确:Azure文件存储本身没有原生的FTP访问端点,但我们可以通过两种可行的方案来实现FTP下载需求,完美适配船舶上的弱网络环境:


方案一:搭建Azure VM作为FTP中转服务器(最直观易实现)

这个思路是用一台Azure虚拟机做中间层,把Azure文件存储挂载到VM上,再通过VM上的FTP服务把文件暴露给船舶端:

  1. 创建Azure VM并安装FTP服务

    • 选一台低配置的VM(比如B1s足够用),系统选Windows Server或者Ubuntu都可以
    • Windows的话直接用IIS搭建FTP服务器:打开服务器管理器→添加角色和功能→勾选FTP服务器,跟着向导配置即可
    • Ubuntu的话可以用vsftpd,安装命令:sudo apt-get install vsftpd,然后修改配置文件开启读取权限
  2. 将Azure文件存储挂载到VM

    • 先从Azure门户获取文件存储的连接字符串和共享名称
    • Windows VM挂载命令(管理员权限运行):
      net use Z: \\<存储账户名>.file.core.windows.net\<共享名> /u:AZURE\<存储账户名> <存储账户密钥>
      
    • Ubuntu VM挂载命令:
      sudo mkdir /mnt/azurefiles
      sudo mount -t cifs //<存储账户名>.file.core.windows.net/<共享名> /mnt/azurefiles -o username=<存储账户名>,password=<存储账户密钥>,vers=3.0
      
  3. 配置FTP服务指向挂载目录

    • Windows IIS里把FTP站点的物理路径设置为刚才挂载的Z盘
    • Ubuntu vsftpd里修改vsftpd.conf,把local_root设置为/mnt/azurefiles,然后重启服务:sudo systemctl restart vsftpd
  4. 船舶端连接FTP下载
    直接用任何FTP客户端(比如FileZilla、WinSCP)连接VM的公网IP,输入FTP账号密码就能下载文件,这种方式和你用TeamViewer的FTP体验一致,弱网络下稳定性好。


方案二:用Azure Functions实现轻量FTP服务(无VM维护成本)

如果不想长期维护VM,可以用Azure Functions做一个轻量的中间层,直接读取Azure文件存储并通过FTP协议传输给船舶端:

  1. 创建Azure Function(C#为例)
    选择HTTP触发的Function,然后引入FluentFTP NuGet包来处理FTP逻辑

  2. 核心代码示例(主动推送文件到船舶端FTP)

    using FluentFTP;
    using Microsoft.Azure.WebJobs;
    using Microsoft.Extensions.Logging;
    using System.IO;
    using System.Threading.Tasks;
    
    public static async Task Run(HttpRequest req, ILogger log)
    {
        // 从请求参数或配置中获取必要信息
        string fileName = req.Query["fileName"];
        string storageAccountName = "<你的存储账户名>";
        string storageAccountKey = "<你的存储账户密钥>";
        string shareName = "<你的文件共享名>";
        string shipFtpIp = "<船舶端FTP服务IP>";
        string shipFtpUser = "<FTP账号>";
        string shipFtpPwd = "<FTP密码>";
    
        // 连接Azure文件存储并读取文件流
        var shareClient = new Azure.Storage.Files.Shares.ShareClient(
            $"DefaultEndpointsProtocol=https;AccountName={storageAccountName};AccountKey={storageAccountKey};EndpointSuffix=core.windows.net",
            shareName);
        var fileClient = shareClient.GetFileClient(fileName);
        var stream = new MemoryStream();
        await fileClient.DownloadToAsync(stream);
        stream.Position = 0;
    
        // 通过FTP将文件推送到船舶端
        using var ftpClient = new FtpClient(shipFtpIp, shipFtpUser, shipFtpPwd);
        await ftpClient.ConnectAsync();
        await ftpClient.UploadAsync(stream, fileName);
        await ftpClient.DisconnectAsync();
    
        return new OkObjectResult("文件已通过FTP发送至船舶端");
    }
    

    如果你需要船舶端主动拉取,可以基于FluentFTP在Function中搭建完整的FTP服务端逻辑,监听FTP请求并从Azure文件存储读取文件返回。


补充:为什么WebRequest下载慢?

WebRequest默认配置没有针对弱网络优化,如果你暂时不想换FTP,可以尝试调整这些参数提速:

  • 启用分块下载:设置request.AllowReadStreamBuffering = false
  • 提升并发连接数:修改ServicePointManager.DefaultConnectionLimit为10以上
  • 添加重试机制:捕获WebException并重试请求

但显然FTP在弱网络下的重试和传输机制更适配你的场景,所以优先推荐前面的两种FTP方案。

内容的提问来源于stack exchange,提问作者Joe 89

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:04:47