【问题标题】:FTP file uploaded to ASP pageFTP 文件上传到 ASP 页面
【发布时间】:2015-05-06 03:25:16
【问题描述】:

我看到了一些类似于我的问题的答案,但仍然无法弄清楚。

我正在使用下面的代码让用户上传 MP3 文件(我使用的是 FTP),它在本地主机(简单的 WinForm 应用程序)上运行良好,但在使用远程服务器(远程 DNN 站点)时抛出错误:

System.IO.FileNotFoundException: 找不到文件 'C:\Windows\SysWOW64\inetsrv\Test.mp3'。

我知道如果test.mp3 文件位于此服务器位置,那么它应该可以工作,但它实际上位于我的C:\Temp\Test.mp3 路径中。我认为FileUpload1 没有给出正确的文件路径。我该如何解决这个问题?

protected void btnUpload_Click(object sender, EventArgs e)
{
    string url = System.Configuration.ConfigurationManager.AppSettings["FTPUrl"].ToString();
    string username = System.Configuration.ConfigurationManager.AppSettings["FTPUserName"].ToString();
    string password = System.Configuration.ConfigurationManager.AppSettings["FTPPassWord"].ToString();

    string filePath = FileUpload1.PostedFile.FileName;
    if (filePath != String.Empty)
        UploadFileToFtp(url, filePath, username, password);
}

public static void UploadFileToFtp(string url, string filePath, string username, string password)
{
    var fileName = Path.GetFileName(filePath);
    var request = (FtpWebRequest)WebRequest.Create(url + fileName);

    request.Method = WebRequestMethods.Ftp.UploadFile;
    request.Credentials = new NetworkCredential(username, password);
    request.UsePassive = true;
    request.UseBinary = true;
    request.KeepAlive = false;

    using (var fileStream = File.OpenRead(filePath))
    {
        using (var requestStream = request.GetRequestStream())
        {
            fileStream.CopyTo(requestStream);
            requestStream.Close();
        }
    }

    var response = (FtpWebResponse)request.GetResponse();
    Console.WriteLine("Upload done: {0}", response.StatusDescription);
    response.Close();
}

【问题讨论】:

  • 您尝试做的事情非常令人困惑...您是尝试将文件从服务器上传到其他 FTP 服务器,还是尝试通过您的 IIS 服务器从浏览器上传文件到外部 FTP 服务器?
  • 旁注:“asp-classic”不太可能是您帖子的正确标签。可能是“ASP.Net”+“WebForms”——如果是这样,请编辑。

标签: c# asp.net upload ftp dotnetnuke


【解决方案1】:

HttpPostedFile.FileName客户端上文件的完全限定名”

而且我相信大多数网络浏览器实际上只提供文件名,没有任何路径。所以你只得到Test.mp3,当你尝试在服务器本地使用这样的“相对”路径时,它会被解析到Web服务器的当前工作目录,C:\Windows\SysWOW64\inetsrv是什么。

改为直接使用HttpPostedFile.InputStream 访问上传的内容(将其复制到GetRequestStream)。

HttpPostedFile documentation

【讨论】:

  • 即使我从本地 PC 加载文件,该路径也是服务器路径,但它试图查看服务器。我认为我的托管服务提供商不允许我使用 FTP 来使用 ftp 传输到另一台服务器。
  • 我想你不明白我的回答。我知道C:\Windows\SysWOW64\inetsrv\Test.mp3 是一个服务器路径。我认为在您的情况下,HttpPostedFile.FileName 是“Test.mp3”。由于这不是绝对路径,因此假定当前工作目录(可能是“C:\Windows\SysWOW64\inetsrv”)。您的问题绝对与您的托管服务提供商阻止 FTP 无关。你甚至还没有走到那一步。
  • 我很抱歉,但我尝试了你的建议(可能不完全?),这里是代码:HttpPostedFile fileStream = FileUpload1.PostedFile;使用 (var requestStream = request.GetRequestStream()) { fileStream.InputStream.CopyTo(requestStream); requestStream.Close();再次,我测试了它,它可以在我的本地 PC 上运行,但是放在服务器上时它给了我错误:InnerMessage:Unable to connect to the remote server
  • 可能不允许您从 Web 服务器连接到 FTP 服务器。但这是一个不同的问题,对吧?我相信这个话题已经解决了。
  • 我认为你是对的。这不是问题,因为我无权从当前服务器连接到另一台服务器。
猜你喜欢
  • 2012-03-12
  • 1970-01-01
  • 1970-01-01
  • 2013-08-22
  • 2014-02-08
  • 1970-01-01
  • 2013-05-07
  • 1970-01-01
相关资源
最近更新 更多