在C#中使用FTP上传带有编码的文件

以下代码适用于上传文本文件,但无法上传JPEG文件(不完全 – 文件名很好但图像已损坏):

private void up(string sourceFile, string targetFile) { try { string ftpServerIP = ConfigurationManager.AppSettings["ftpIP"]; string ftpUserID = ConfigurationManager.AppSettings["ftpUser"]; string ftpPassword = ConfigurationManager.AppSettings["ftpPass"]; //string ftpURI = ""; string filename = "ftp://" + ftpServerIP + "//" + targetFile; FtpWebRequest ftpReq = (FtpWebRequest)WebRequest.Create(filename); ftpReq.Method = WebRequestMethods.Ftp.UploadFile; ftpReq.Credentials = new NetworkCredential(ftpUserID, ftpPassword); StreamReader stream = new StreamReader(sourceFile); Byte[] b = System.Text.Encoding.UTF8.GetBytes(stream.ReadToEnd()); stream.Close(); ftpReq.ContentLength = b.Length; Stream s = ftpReq.GetRequestStream(); s.Write(b, 0, b.Length); s.Close(); System.Net.FtpWebResponse ftpResp = (FtpWebResponse)ftpReq.GetResponse(); MessageBox.Show(ftpResp.StatusDescription); } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } 

我有另一个可以上传文件的解决方案:

 private void Upload(string sourceFile, string targetFile) { string ftpUserID; string ftpPassword; string ftpServerIP; ftpServerIP = ConfigurationManager.AppSettings["ftpIP"]; ftpUserID = ConfigurationManager.AppSettings["ftpUser"]; ftpPassword = ConfigurationManager.AppSettings["ftpPass"]; FileInfo fileInf = new FileInfo(sourceFile); FtpWebRequest reqFTP; // Create FtpWebRequest object from the Uri provided reqFTP = (FtpWebRequest)(FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP + "//" + targetFile))); // Provide the WebPermission Credintials reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); // Bypass default lan settings reqFTP.Proxy = null; // By default KeepAlive is true, where the control connection is not closed // after a command is executed. reqFTP.KeepAlive = false; // Specify the command to be executed. reqFTP.Method = WebRequestMethods.Ftp.UploadFile; // Specify the data transfer type. reqFTP.UseBinary = true; // Notify the server about the size of the uploaded file reqFTP.ContentLength = fileInf.Length; // The buffer size is set to 2kb int buffLength = 2048; Byte[] buff; buff = new byte[buffLength]; int contentLen; // Opens a file stream (System.IO.FileStream) to read the file to be uploaded FileStream fs = fileInf.OpenRead(); try { // Stream to which the file to be upload is written Stream strm = reqFTP.GetRequestStream(); // Read from the file stream 2kb at a time long filesize = fs.Length; int i=0; contentLen = fs.Read(buff, 0, buffLength); // Till Stream content ends while (contentLen != 0) { Application.DoEvents(); // Write Content from the file stream to the FTP Upload Stream strm.Write(buff, 0, contentLen); contentLen = fs.Read(buff, 0, buffLength); i = i + 1; //Double percentComp = (i * buffLength) * 100 / filesize; //ProgressBar1.Value = (int)percentComp; } // Close the file stream and the Request Stream strm.Close(); fs.Close(); } catch (Exception ex) { MessageBox.Show(ex.Message, "Upload Error"); } } 

但在这里我有相反的问题 – 图片很好,但文件名已损坏。

我知道这是因为编码,但我不知道如何使字节数组具有所需的编码…

试试这个:

 private static void up(string sourceFile, string targetFile) { try { string ftpServerIP = ConfigurationManager.AppSettings["ftpIP"]; string ftpUserID = ConfigurationManager.AppSettings["ftpUser"]; string ftpPassword = ConfigurationManager.AppSettings["ftpPass"]; ////string ftpURI = ""; string filename = "ftp://" + ftpServerIP + "//" + targetFile; FtpWebRequest ftpReq = (FtpWebRequest)WebRequest.Create(filename); ftpReq.UseBinary = true; ftpReq.Method = WebRequestMethods.Ftp.UploadFile; ftpReq.Credentials = new NetworkCredential(ftpUserID, ftpPassword); byte[] b = File.ReadAllBytes(sourceFile); ftpReq.ContentLength = b.Length; using (Stream s = ftpReq.GetRequestStream()) { s.Write(b, 0, b.Length); } FtpWebResponse ftpResp = (FtpWebResponse)ftpReq.GetResponse(); if (ftpResp != null) { MessageBox.Show(ftpResp.StatusDescription); } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } 

您应该使用Stream来读取二进制文件,而不是StreamReaderStreamReader仅用于读取文本文件。

在您的第一个代码示例中,启用二进制传输: FtpWebRequest.UseBinary = true 。 否则它将转换它认为是各种平台约定之间的文本行结尾(但实际上是图像的一部分)。

你的第二个片段以正确的方式完成。 它使用FileStream,而不是StreamReader。 StreamReader仅适用于文本文件。

System.Text.Encoding.UTF8.GetBytes(stream.ReadToEnd());

除非您的流的内容是文本,否则请勿这样做。 将函数更改为接受布尔参数“binary”,如果设置了该标志,则使用后者的工作方法。

如果遇到此问题: 使用HTTP时不支持请求的FTP命令

你需要在Null或Nothing中设置代理。

 ftpReq.Proxy = null; 

你可以看到这个博客。

http://mycodetrip.com/2008/10/29/fix-for-error-the-requested-ftp-command-is-not-supported-when-using-http-proxy_118/comment-page-1/#comment -2825

谢谢。