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

ASP.NET MVC5+AngularJS环境下,如何实现FTP服务器文件下载?

解决MVC5 + AngularJS下FTP文件下载的问题

嘿,我明白你现在的困扰——直接用FTP路径给MVC的File方法肯定行不通,因为这个方法默认是读取本地服务器文件系统的内容,没法直接访问远程FTP服务器上的文件。咱们得换个思路:先把FTP上的文件拉到服务器内存里,再返回给客户端让用户下载。

下面是完整的解决方案,分后端(MVC5)和前端(AngularJS)两部分:

后端:MVC Controller处理FTP文件读取与返回

首先,咱们需要一个工具方法,用来从FTP服务器获取文件的流。用.NET自带的FtpWebRequest就能搞定,不用额外装包:

private Stream GetFtpFileStream(string ftpUrl, string username, string password)
{
    var request = (FtpWebRequest)WebRequest.Create(ftpUrl);
    request.Method = WebRequestMethods.Ftp.DownloadFile;
    request.Credentials = new NetworkCredential(username, password);
    
    using (var response = (FtpWebResponse)request.GetResponse())
    {
        var responseStream = response.GetResponseStream();
        // 把流复制到内存流,避免后续关闭响应时流被释放
        var memoryStream = new MemoryStream();
        responseStream.CopyTo(memoryStream);
        memoryStream.Position = 0;
        return memoryStream;
    }
}

然后在你的Controller里写一个Action,调用这个方法获取流,再返回给客户端:

public ActionResult DownloadFtpFile()
{
    // 替换成你的FTP文件地址、用户名和密码
    string ftpFilePath = "ftp://your-ftp-server/path/to/your/file.mp3";
    string ftpUsername = "your-ftp-username";
    string ftpPassword = "your-ftp-password";
    
    // 获取FTP文件的内存流
    var fileStream = GetFtpFileStream(ftpFilePath, ftpUsername, ftpPassword);
    
    // 设置下载的文件名和MIME类型
    string fileName = "your-custom-filename.mp3";
    string mimeType = "audio/mp3";
    
    // 注意这里用attachment而不是inline,强制浏览器下载而不是预览
    Response.AddHeader("Content-Disposition", $"attachment; filename=\"{fileName}\"");
    return File(fileStream, mimeType);
}

前端:AngularJS发起请求并触发下载

AngularJS这边需要发起请求获取二进制文件,然后创建下载链接触发浏览器下载:

app.controller('DownloadController', ['$scope', '$http', function($scope, $http) {
    $scope.downloadFile = function() {
        $http({
            method: 'GET',
            url: '/YourController/DownloadFtpFile',
            responseType: 'blob' // 关键:告诉AngularJS返回的是二进制Blob
        }).then(function(response) {
            // 创建下载链接
            var url = window.URL.createObjectURL(response.data);
            var a = document.createElement('a');
            a.href = url;
            a.download = 'your-custom-filename.mp3'; // 这里的文件名可以和后端一致,也可以单独设置
            document.body.appendChild(a);
            a.click();
            // 清理资源
            window.URL.revokeObjectURL(url);
            document.body.removeChild(a);
        }, function(error) {
            console.error('下载失败:', error);
            alert('文件下载失败,请稍后重试');
        });
    };
}]);

为什么你原来的代码不行?

你之前写的var filePath = "FTP_FILE_PATH"; return File(filePath, "audio/mp3");,这里的filePath是FTP地址,但MVC的File(string path, string contentType)方法是去本地服务器的文件系统找这个路径,根本识别不了FTP协议的地址,所以自然返回不了正确的文件。

额外注意事项

  • 确保你的服务器能访问到FTP服务器(防火墙、端口开放等)
  • 如果FTP文件很大,用内存流可能会占用较多服务器内存,这种情况可以考虑先下载到服务器临时目录,再返回临时文件,之后记得清理临时文件
  • 记得处理FTP连接失败、文件不存在等异常情况,给用户友好的提示

内容的提问来源于stack exchange,提问作者Rishi Malviya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:52:29