WebApi 上传附件到 ftp 服务器

想要实现的功能:Post附件到WebApi,WebApi 将文件转发到 ftp服务器。
主要功能已经实现,有一个问题:需要在WebApi服务器,接收流写入WebApi本地文件,然后读取文件流写入 ftp 服务器,然后再删除WebApi 服务器上的本地文件,现在不想在WebApi本地写文件,直接取Request的流写入到 ftp,不知道能不能实现,应该怎样写?

  1. Post附件到WebApi 主要代码:
    #region 上传文件
    ///
    /// 通过multipart/form-data方式上传文件
    ///
    ///
    [HttpPost]
    public async Task PostFile()
    {
    MessagesDataCodeModel json = new MessagesDataCodeModel(false, "无效参数", 401);

        try
        {
            // 是否请求包含multipart/form-data。
            if (!Request.Content.IsMimeMultipartContent())
            {
                logger.Error("上传格式不是multipart/form-data");
                throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
            }
    
            string root = HttpContext.Current.Server.MapPath("/UploadFiles/");
            if (!Directory.Exists(HttpContext.Current.Server.MapPath("~/UploadFiles/")))
            {
                Directory.CreateDirectory(HttpContext.Current.Server.MapPath("~/UploadFiles/"));
            }
    
            var provider = new MultipartFormDataStreamProvider(root);
    
            StringBuilder sb = new StringBuilder(); // Holds the response body
    
            // 阅读表格数据并返回一个异步任务.
            await Request.Content.ReadAsMultipartAsync(provider);
    
            // 如何上传文件到文件名.
            foreach (var file in provider.FileData)
            {
                string orfilename = file.Headers.ContentDisposition.FileName.TrimStart('"').TrimEnd('"');
                FileInfo fileinfo = new FileInfo(file.LocalFileName);
                //sb.Append(string.Format("Uploaded file: {0} ({1} bytes)\n", fileInfo.Name, fileInfo.Length));
                //最大文件大小
                //int maxSize = Convert.ToInt32(SettingConfig.MaxSize);
                if (fileinfo.Length <= 0)
                {
                    json.Success = false;
                    json.Msg = "请选择上传文件";
                    json.Code = 301;
                }
                else if (fileinfo.Length > ConfigHelper.MaxFileSize)
                {
                    json.Msg = "上传文件大小超过限制";
                    json.Code = 302;
                }
                else
                {
                    string fileExt = orfilename.Substring(orfilename.LastIndexOf('.'));
                    //定义允许上传的文件扩展名
                    //String fileTypes = SettingConfig.FileTypes;
                    //if (String.IsNullOrEmpty(fileExt) || Array.IndexOf(fileTypes.Split(','), fileExt.Substring(1).ToLower()) == -1)
                    //{
                    //    json.Msg = "图片类型不正确";
                    //    json.Code = 303;
                    //}
                    //else
                    //{
                    //String ymd = DateTime.Now.ToString("yyyyMMdd", System.Globalization.DateTimeFormatInfo.InvariantInfo);
                    //String newFileName = DateTime.Now.ToString("yyyyMMddHHmmss_ffff", System.Globalization.DateTimeFormatInfo.InvariantInfo);
    
                    fileinfo.CopyTo(Path.Combine(root, fileinfo.Name + fileExt), true);
                    json.Success = true;
                    json.Msg = "操作成功";
                    json.Code = 200;
                    sb.Append("/UploadFiles/" + fileinfo.Name + fileExt);
                    json.Data = sb.ToString();
                    //}
                }
                fileinfo.Delete();//删除原文件
            }
        }
        catch (System.Exception e)
        {
            json.Success = false;
            json.Msg = "服务器无响应";
            json.Code = 500;
            logger.Error("PostFile()服务器错误", e);
        }
        return ToJsonTran.ToJson(json);
    }
    #endregion 上传文件
    
  2. 上传到 ftp服务器
    ///
    /// 上传文件
    ///
    /// 需要上传的文件
    /// 目标路径
    /// ftp地址
    /// ftp用户名
    /// ftp密码
    public static void UploadFile(FileInfo fileinfo, string targetDir, string hostname, string username, string password)
    {
    //1. check target
    string target;
    if (targetDir.Trim() == "")
    {
    return;
    }
    target = Guid.NewGuid().ToString(); //使用临时文件名
    string URI = "FTP://" + hostname + "/" + targetDir + "/" + target;
    ///WebClient webcl = new WebClient();
    System.Net.FtpWebRequest ftp = GetRequest(URI, username, password);
    //设置FTP命令 设置所要执行的FTP命令,
    //ftp.Method = System.Net.WebRequestMethods.Ftp.ListDirectoryDetails;//假设此处为显示指定路径下的文件列表
    ftp.Method = System.Net.WebRequestMethods.Ftp.UploadFile;
    //指定文件传输的数据类型
    ftp.UseBinary = true;
    ftp.UsePassive = true;
    //告诉ftp文件大小
    ftp.ContentLength = fileinfo.Length;
    //缓冲大小设置为2KB
    const int BufferSize = 2048;
    byte[] content = new byte[BufferSize - 1 + 1];
    int dataRead;
    //打开一个文件流 (System.IO.FileStream) 去读上传的文件
    using (FileStream fs = fileinfo.OpenRead())
    {
    try
    {
    //把上传的文件写入流
    using (Stream rs = ftp.GetRequestStream())
    {
    do
    {
    //每次读文件流的2KB
    dataRead = fs.Read(content, 0, BufferSize);
    rs.Write(content, 0, dataRead);
    } while (!(dataRead < BufferSize));
    rs.Close();
    }
    }
    catch (Exception ex) { }
    finally
    {
    fs.Close();
    }
    }
    ftp = null;
    //设置FTP命令
    ftp = GetRequest(URI, username, password);
    ftp.Method = System.Net.WebRequestMethods.Ftp.Rename; //改名
    ftp.RenameTo = fileinfo.Name;
    try
    {
    ftp.GetResponse();
    }
    catch (Exception ex)
    {
    ftp = GetRequest(URI, username, password);
    ftp.Method = System.Net.WebRequestMethods.Ftp.DeleteFile; //删除
    ftp.GetResponse();
    throw ex;
    }
    finally
    {
    //fileinfo.Delete();
    }
    // 可以记录一个日志 "上传" + fileinfo.FullName + "上传到" + "FTP://" + hostname + "/" + targetDir + "/" + fileinfo.Name + "成功." );
    ftp = null;
    #region
    /*****
    *FtpWebResponse

  3. ****/
    //FtpWebResponse ftpWebResponse = (FtpWebResponse)ftp.GetResponse();
    #endregion
    }

1个回答

主要是 Http 的流 比较难取,看了一下现在用的方法,里面的流是私有的变量,取不到。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问