【问题标题】:FtpWebRequest Download File FailedFtpWebRequest 下载文件失败
【发布时间】:2018-05-04 04:37:16
【问题描述】:

在我的网站中,我列出了 ftp 文件夹文件,当用户单击下载按钮时,我调用下面的代码,然后将文件下载到他们的 C 盘。但是我收到错误访问路径“C:\myvideo.flv”被拒绝。

代码正在服务器上运行,需要保存到本地 PC 驱动器。

ASP.NET 无权访问请求的资源。考虑向 ASP.NET 请求标识授予对资源的访问权限。 ASP.NET 有一个基本进程标识(通常是 IIS 5 上的 {MACHINE}\ASPNET 或 IIS 6 和 IIS 7 上的网络服务,以及 IIS 7.5 上配置的应用程序池标识),如果应用程序不是模拟的,则使用该标识。如果应用程序通过 模拟,则身份将是匿名用户(通常是 IUSR_MACHINENAME)或经过身份验证的请求用户。

我是否错过了FtpWebRequest 的某个时间或其他原因导致此问题。

      FtpWebRequest request = (FtpWebRequest)WebRequest.Create(FTPRequest_Host + "myvideo.flv");
        request.Method = WebRequestMethods.Ftp.DownloadFile;
        request.KeepAlive = true;
        request.UsePassive = true;
        request.UseBinary = true;

        request.Credentials = new NetworkCredential(FTPRequest_Username, FTPRequest_Password);

        FtpWebResponse response = (FtpWebResponse)request.GetResponse();

        Stream responseStream = response.GetResponseStream();
        StreamReader reader = new StreamReader(responseStream);

        using (FileStream writer = new FileStream(@"C: \\" + "myvideo.flv", FileMode.Create, FileAccess.ReadWrite))
        {

            long length = response.ContentLength;
            int bufferSize = 2048;
            int readCount;
            byte[] buffer = new byte[2048];

            readCount = responseStream.Read(buffer, 0, bufferSize);
            while (readCount > 0)
            {
                writer.Write(buffer, 0, readCount);
                readCount = responseStream.Read(buffer, 0, bufferSize);
            }
        }

        reader.Close();
        response.Close();

【问题讨论】:

  • 您是否以管理员身份运行您的应用程序?您可以将文件直接放在 C:\ 作为您运行的用户吗?没有来自 Windows 的任何提示?
  • C: 和两个 `\` 字符之后确实有一个奇怪的空格。我不确定这是问题的根源还是其他原因......
  • 正确的本地路径应该是@"C:\myvideo.flv",因为它包含在文字字符串中。此外,C: 驱动器在 Windows 7 或更高版本中被视为系统驱动器,您需要提升权限(即以管理员身份运行 VS)才能保存在C: 驱动器中。

标签: c# asp.net-mvc ftpwebrequest


【解决方案1】:

我认为您可能对C:\ 驱动器的使用存在权限相关问题,因为在 Windows Vista 及更高版本中,驱动器被视为系统驱动器,因此您需要由具有提升权限的用户运行代码来保存视频文件在相应的驱动器中。

如果您想避免文件权限混乱,请尝试使用Server.MapPath()更改要保存的视频文件的路径,因为默认情况下ASP.NET不允许直接访问服务器驱动器的根目录:

using (FileStream writer = new FileStream(Server.MapPath("~/files/myvideo.flv", FileMode.Create, FileAccess.ReadWrite))
{
    // other stuff
}

如果您仍想使用提供的代码将视频文件保存在系统驱动器中,请使用在应用程序池身份中具有管理员权限的用户运行您的应用程序池。

其他信息:

由于您在 ASP.NET 环境中运行请求进程,请考虑为具有指定文件/文件夹路径的当前应用程序池身份用户授予写入权限。

类似问题:

FileStream not letting me create file on C drive

【讨论】:

  • 嗨,我收到此错误ASP.NET is not authorized to access the requested resource. Consider granting access rights to the resource to the ASP.NET request identity. ASP.NET has a base process identity (typically {MACHINE}\ASPNET on IIS 5 or Network Service on IIS 6 and IIS 7, and the configured application pool identity on IIS 7.5) that is used if the application is not impersonating. If the application is impersonating via <identity impersonate="true"/>, the identity will be the anonymous user (typically IUSR_MACHINENAME) or the authenticated request user.
  • 好吧,我意识到 ASP.NET 不允许访问服务器中任何驱动器的根路径,在控制器操作中正确使用 FileStream 进行编辑。
  • 我想保存到本地驱动器而不是服务器驱动器,但代码在服务器而不是本地主机上运行
  • "本地驱动器" => 你的意思是客户端机器的驱动器吗?如果我是对的,不,您既无法控制用户在客户端将文件保存在何处,也无法在客户端机器内打开保存的文件。如果要在客户端浏览器中播放流,请使用 return File()objectembed 标签代替。
  • 在我的网站上我列出了 ftp 文件夹文件,当用户单击下载按钮时,我调用我的代码(在问题中),然后将文件下载到他们的 c 驱动器,所以这是不可能的?
【解决方案2】:

这是权限问题!如果您在 Visual Studio (IIS Express) 中运行应用程序,请使用 Run as administrator 打开 Visual Studio。 它托管在 IIS 中,Application Pool Identity 应该有足够的权限来访问C 驱动器。

【讨论】:

  • 我在服务器上运行应用程序,我需要将它保存到本地驱动器
  • 虽然不可取,但您可以将应用程序池标识用户添加为 IIS 服务器管理员的一部分。
【解决方案3】:

问题不在 FtpWebRequest 中。该异常来自 FileStream 对象,因为您可能在某些软件(例如视频播放器)中打开了视频文件,导致 FileStream 对象无法写入该文件。

【讨论】:

  • 我没有在某些软件中打开视频,它在ftp中
【解决方案4】:

你对事情的所作所为感到困惑

@"C: \\" + "myvideo.flv"

@ 表示你不必逃避反斜杠,所以我们得到

@"C: \" + "myvideo.flv"

但是有一个奇怪的空间

@"C:\" + "myvideo.flv"

所以这很好(假设您可以写入 C:\ 的根目录)

【讨论】:

    猜你喜欢
    • 2011-02-16
    • 2012-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    • 2021-03-01
    • 1970-01-01
    相关资源
    最近更新 更多