【问题标题】:How Stream files in User Request Without Buffering Request in memory or disk in ASP.Net在 ASP.Net 中,如何在用户请求中流式传输文件而不在内存或磁盘中缓冲请求
【发布时间】:2015-12-31 14:32:08
【问题描述】:

这是我将用户输入文件上传到 ftp 服务器的代码:

 public static bool UploadFile(string FilePath, HttpPostedFileBase file)
    {
        Stream ftpStream = null;
        FtpWebRequest request = null;
        FtpWebResponse response = null;            
        try
        {
            FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create(ftpURL + FilePath);
            ftpRequest.Method = WebRequestMethods.Ftp.UploadFile;
            ftpRequest.Credentials = new NetworkCredential(UserName, Password);
            ftpRequest.ContentLength = file.ContentLength;
            Stream requestStream = ftpRequest.GetRequestStream();

            Byte[] buffer = new Byte[buferSize];
            int bytesRead = file.InputStream.Read(buffer, 0, buferSize);
            while (bytesRead > 0)
            {
                requestStream.Write(buffer, 0, bytesRead);
                bytesRead = file.InputStream.Read(buffer, 0, buferSize);
            }
            requestStream.Close();
            return true;
        }
        catch (Exception)
        {
            return false;
        }
    }

它似乎工作正常。但有一个问题。 当用户尝试上传文件时(一个大文件!) 它需要很长时间(我认为将文件保存在主机服务器内存或磁盘中!) 再拿一个! ftp上传时间长。 现在的问题是我可以通过我的主机将用户输入文件直接上传到 ftp 服务器。我的意思是使用 HttpPostedFile 我有一个来自文件的流以将其保存在 Ftp 服务器中并减少上传文件的时间。

(抱歉语言和信息不佳!我是 MVC 的新手。)

【问题讨论】:

    标签: c# asp.net-mvc


    【解决方案1】:

    您的代码看起来非常好。 HttpPostedFileBase 只是指向包含文件数据的底层网络流的指针(流)。这个文件永远不会在内存中完全读取,因为您只是从底层 TCP 套接字中读取块:这也是非常好的和高效的。此外,您还直接将已读取的字节块复制到远程 FTP 服务器上的传出套接字。除了提高不同跃点之间的网络速度之外,没有太多可以优化此代码的方法。

    我只能建议使用Stream.CopyTo 方法对您的代码进行语法简化:

    var ftpRequest = (FtpWebRequest)WebRequest.Create(ftpURL + FilePath);
    ftpRequest.Method = WebRequestMethods.Ftp.UploadFile;
    ftpRequest.Credentials = new NetworkCredential(UserName, Password);
    ftpRequest.ContentLength = file.ContentLength;
    using (Stream requestStream = ftpRequest.GetRequestStream())
    {
        file.InputStream.CopyTo(requestStream);
    }
    return true;
    

    如果到该 FTP 服务器的网络连接速度很慢,并且您无法控制我能想到的这一小改进,那就是将上传的文件存储在您的网络服务器上,然后有一些后台作业将运行并将其上传到远程 FTP 服务器.这样,客户端就不需要等待文件上传到 FTP - 他只需要等待文件上传到您的网络服务器。

    【讨论】:

      【解决方案2】:

      求答案!

      主要问题是在内存(和磁盘)中缓冲所有请求。

      我搜索并找到了一些帮助完整的文章。但我没有将它们联系起来的声誉!哈哈

      我完全用this way 来解决问题。

      这是代码:

      [RequestAuthorized(CurrentUser = UserTypes.AdminDeveloper)]
       public async Task<ActionResult> Create_Step4()
          {
              ...blabla
              var requestStream = HttpContext.Request.GetBufferlessInputStream();
              var mpp = new MultipartPartParser(requestStream);
              long fileSize = FTPUtility.UploadFile(FilePath, mpp);
          }
      

          public static long UploadFile(string FilePath, MultipartPartParser file)
          {           
              try
              {
                  FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create(ftpURL + FilePath.Substring(1).Replace('\\', '/'));
                  ftpRequest.Method = WebRequestMethods.Ftp.UploadFile;
                  ftpRequest.Credentials = new NetworkCredential(UserName, Password);
      
                  Stream requestStream = ftpRequest.GetRequestStream();
                  long fileSize = 0;
                  Byte[] buffer = new Byte[buferSize];
                  int bytesRead = file.Read(buffer, 0, buferSize);
                  fileSize += bytesRead;
                  while (bytesRead > 0)
                  {
                      requestStream.Write(buffer, 0, bytesRead);
                      bytesRead = file.Read(buffer, 0, buferSize);
                      fileSize += bytesRead;
                  }
                  requestStream.Close();
      
                  return fileSize;
              }
              catch (Exception)
              {
                  return -1;
              }
          }
      

      【讨论】:

        猜你喜欢
        • 2020-07-08
        • 2013-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-07
        • 2015-07-13
        • 2010-12-29
        • 1970-01-01
        相关资源
        最近更新 更多