【问题标题】:Decoding and encoding PDF to send through FTP对 PDF 进行解码和编码以通过 FTP 发送
【发布时间】:2021-08-09 16:49:58
【问题描述】:

各位程序员大家好! 我在通过 FTP 发送 PDF 时遇到问题。我想将正确创建的 PDF 复制到 FTP 目录,不幸的是我发送的文件大小合适,但我无法使用任何 PDF 编辑器打开它。我试过搜索解决方案,但我的转换和编码似乎不起作用。这是我的代码:

     public string SendPDF(string FileNamePath, string ShortFileName)
        {
            string Response = string.Empty;
          //FullPath is generated in class constructor
            FtpWebRequest request = (FtpWebRequest)WebRequest.Create(FullPath+@"\"+ShortFileName+".pdf");
            request.Method = WebRequestMethods.Ftp.UploadFile;

            request.Credentials = new NetworkCredential(User, Password);
       //FileNamePath is directory of source file
           byte[] fileContents= File.ReadAllBytes(@FileNamePath + ".pdf");
            string pdfBase64 = Convert.ToBase64String(fileContents);

            using(var stream  = GenerateStreamFromString(pdfBase64))
            {
                request.ContentLength = stream.Length;

                using (Stream requestStream = request.GetRequestStream())
                {
                    stream.CopyTo(requestStream);
                    requestStream.Close();
                }
            }

                



            using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
            {
                Response = "Upload File PDF Complete, status" + Convert.ToString(response.StatusDescription);
            }

            return Response;
        }
 public static Stream GenerateStreamFromString(string s)
        {
            var stream = new MemoryStream();
            var writer = new StreamWriter(stream);
            writer.Write(s);
            writer.Flush();
            stream.Position = 0;
            return stream;
        }

另外,我试过下面的代码,但它有同样的问题:

 byte[] fileContents ;

            using (StreamReader sourceStream = new StreamReader(FileNamePath + ".pdf"))
            {
                fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd());
            }

            request.ContentLength = fileContents.Length;

            using (Stream requestStream = request.GetRequestStream())
            {
                requestStream.Write(fileContents, 0, fileContents.Length);
            }

通过 XML 文件发送完全正常。提前谢谢你,请不要苛刻这是我在这里的第一个问题:3

【问题讨论】:

  • 为什么要发送 Base64 字节字符串?您应该直接将 PDF 文件的原始字节发送到服务器端。
  • 确实,您的代码都不能安全地上传二进制文件。更不用说第一个代码很糟糕。如需正确代码,请参阅Upload and download a file to/from FTP server in C#/.NET
  • 不幸的是,那里发布的所有解决方案都不能解决我的问题:(。
  • @LexLi 我认为更改 pdf 文件的编码可能会有所帮助。当我像第二个代码一样发送原始字节时,它仍然不起作用。

标签: c# ftp .net-standard system.net


【解决方案1】:

我找到了解决方案。问题是缺少参数 request.UseBinary = true。这是正确的代码:

public string SendPDF(string FileNamePath, string ShortFileName)
        {
            string Response = string.Empty;
            FtpWebRequest request = (FtpWebRequest)WebRequest.Create(FTPPath+@"\"+ShortFileName+".pdf");
            request.Method = WebRequestMethods.Ftp.UploadFile;
            request.UseBinary = true;
           
            request.Credentials = new NetworkCredential(User, Password);
          
            byte[] fileContents;

            using (StreamReader sourceStream = new StreamReader(FileNamePath + ".pdf"))
            {
                fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd());
            }

            request.ContentLength = fileContents.Length;

            using (Stream requestStream = request.GetRequestStream())
            {
                requestStream.Write(fileContents, 0, fileContents.Length);
            }


            using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
            {
                Response = "Upload File PDF Complete, status" + Convert.ToString(response.StatusDescription);
            }

            return Response;
        }

【讨论】:

    猜你喜欢
    • 2017-03-24
    • 2010-11-27
    • 1970-01-01
    • 2013-02-27
    • 1970-01-01
    • 1970-01-01
    • 2018-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多