船舶弱网环境下,如何通过FTP从Azure文件存储下载文件?
解决Azure文件存储通过FTP下载的问题
首先得明确:Azure文件存储本身没有原生的FTP访问端点,但我们可以通过两种可行的方案来实现FTP下载需求,完美适配船舶上的弱网络环境:
方案一:搭建Azure VM作为FTP中转服务器(最直观易实现)
这个思路是用一台Azure虚拟机做中间层,把Azure文件存储挂载到VM上,再通过VM上的FTP服务把文件暴露给船舶端:
创建Azure VM并安装FTP服务
- 选一台低配置的VM(比如B1s足够用),系统选Windows Server或者Ubuntu都可以
- Windows的话直接用IIS搭建FTP服务器:打开服务器管理器→添加角色和功能→勾选FTP服务器,跟着向导配置即可
- Ubuntu的话可以用vsftpd,安装命令:
sudo apt-get install vsftpd,然后修改配置文件开启读取权限
将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
配置FTP服务指向挂载目录
- Windows IIS里把FTP站点的物理路径设置为刚才挂载的Z盘
- Ubuntu vsftpd里修改
vsftpd.conf,把local_root设置为/mnt/azurefiles,然后重启服务:sudo systemctl restart vsftpd
船舶端连接FTP下载
直接用任何FTP客户端(比如FileZilla、WinSCP)连接VM的公网IP,输入FTP账号密码就能下载文件,这种方式和你用TeamViewer的FTP体验一致,弱网络下稳定性好。
方案二:用Azure Functions实现轻量FTP服务(无VM维护成本)
如果不想长期维护VM,可以用Azure Functions做一个轻量的中间层,直接读取Azure文件存储并通过FTP协议传输给船舶端:
创建Azure Function(C#为例)
选择HTTP触发的Function,然后引入FluentFTPNuGet包来处理FTP逻辑核心代码示例(主动推送文件到船舶端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
相关产品推荐
相关产品推荐

