FtpWebRequest文件下载失败:本地C盘路径访问被拒问题咨询
问题根源:你搞混了服务器和本地磁盘的操作!
兄弟,你得先搞明白:你的ASP.NET代码是跑在服务器上的,当你写代码试图保存到C:\myvideo.flv时,它要操作的是服务器的C盘,不是用户自己电脑的C盘!系统弹的权限错误,是因为服务器上的ASP.NET进程账号(比如IIS5里的{MACHINE}\ASPNET)没权限往服务器C盘写东西,但这根本不是你真正要解决的问题——你要的是让用户把FTP里的文件下载到他们自己的电脑,对吧?
正确实现:让浏览器触发本地下载
要达到用户点击按钮后把文件存到自己本地的目的,你不需要在服务器端写本地路径,而是要把文件内容通过HTTP响应发给浏览器,让浏览器提示用户保存。给你两种常用的实现方法:
方法1:直接跳转到FTP文件地址
如果你的FTP文件可以公开访问(比如有ftp://你的服务器地址/文件路径/myvideo.flv这样的地址,或者已经映射成HTTP地址),最简单的就是让下载按钮直接指向这个地址:
<a href="ftp://你的服务器地址/文件路径/myvideo.flv" download>下载视频</a>
要是想在后台代码里处理跳转,就写:
Response.Redirect("ftp://你的服务器地址/文件路径/myvideo.flv");
这种方式不用处理文件流,直接让浏览器和FTP服务器交互就行。
方法2:读取FTP文件流,通过HTTP响应输出
如果FTP文件不能直接公开访问,那你得在服务器端先读取FTP里的文件内容,再通过ASP.NET的Response对象把内容发给浏览器:
protected void DownloadButton_Click(object sender, EventArgs e) { // FTP文件的地址 string ftpFilePath = "ftp://你的服务器地址/文件路径/myvideo.flv"; // 用户下载时看到的文件名 string fileName = "myvideo.flv"; // 创建FTP请求 FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ftpFilePath); request.Method = WebRequestMethods.Ftp.DownloadFile; // 如果FTP需要账号密码,这里填上 request.Credentials = new NetworkCredential("FTP账号", "FTP密码"); using (FtpWebResponse response = (FtpWebResponse)request.GetResponse()) using (Stream ftpStream = response.GetResponseStream()) { // 设置响应头,告诉浏览器这是要下载的文件 Response.ContentType = "video/x-flv"; Response.AddHeader("Content-Disposition", $"attachment; filename=\"{fileName}\""); // 把FTP流里的内容复制到响应输出流 ftpStream.CopyTo(Response.OutputStream); Response.End(); } }
这么做之后,浏览器会收到文件内容,自动弹出保存对话框,用户就能选自己本地的任意位置保存(包括他们的C盘),完全不用碰服务器的磁盘。
额外说明:如果你真要往服务器C盘写文件
要是你的需求真的是把文件存到服务器的C盘(不是用户本地),那才需要解决权限问题:
- 找到服务器上的
C:\目录,右键→属性→安全选项卡 - 添加ASP.NET的进程账号(IIS5里是
{MACHINE}\ASPNET,IIS7及以上一般是IIS AppPool\你的应用池名称) - 给这个账号授予写入权限
不过再次提醒,这是操作服务器磁盘的场景,和用户本地下载没关系哦。
内容的提问来源于stack exchange,提问作者FeelRightz
相关产品推荐
相关产品推荐

