3

我使用此代码将图像上传到 ftp。但图像已损坏。我试图上传的图像是一个Base64字符串。我转换为流并将其传递给 UpLoadImage。

 public static void UpLoadImage(Stream image, string target)
   {
    FtpWebRequest req = (FtpWebRequest)WebRequest.Create("ftp://www.examp.com/images/" + target);
    req.UseBinary = true;
    req.Method = WebRequestMethods.Ftp.UploadFile;
    req.Credentials = new NetworkCredential("UserNm", "PassWd");
    StreamReader rdr = new StreamReader(image);
    byte[] fileData = Encoding.UTF8.GetBytes(rdr.ReadToEnd());
    rdr.Close();
    req.ContentLength = fileData.Length;
    Stream reqStream = req.GetRequestStream();
    reqStream.Write(fileData, 0, fileData.Length);
    reqStream.Close();
}

代替:

StreamReader rdr = new StreamReader(image); byte[] fileData = Encoding.UTF8.GetBytes(rdr.ReadToEnd()); rdr.Close();

如果我使用 byte[] fileData = File.ReadAllBytes(image); 它会给我一个错误,文件名超过 260 个字符。

请有人帮忙解决这个问题..

4

2 回答 2

2

喜欢评论说使用

byte[] fileData = File.ReadAllBytes(filePath);

对于所有不是文本文件的文件。

像那样:

private void FTPUPLOAD(string imgPath)
        {
            FTPDelete(img);
            // Get the object used to communicate with the server.
            FtpWebRequest request = (FtpWebRequest)WebRequest.Create(BaseUrl +Path.GetFileName(imgPath));
            request.Method = WebRequestMethods.Ftp.UploadFile;

            // This example assumes the FTP site uses anonymous logon.
            request.Credentials = new NetworkCredential(Account, Password);

            // Copy the contents of the file to the request stream.
             //THIS IS THE CODE
            byte[] fileContents = File.ReadAllBytes(imgPath);

 Stream requestStream = request.GetRequestStream();
            requestStream.Write(fileContents, 0, fileContents.Length);
            requestStream.Close();

            FtpWebResponse response = (FtpWebResponse)request.GetResponse();

            response.Close();
        }
于 2014-09-30T10:00:29.460 回答
1

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

以及关于错误最大路径长度限制

最大路径长度限制 在 Windows API(以下段落中讨论的一些例外情况)中,路径的最大长度为 MAX_PATH,定义为 260 个字符。本地路径按以下顺序构造:驱动器号、冒号、反斜杠、由反斜杠分隔的名称组件和终止空字符。例如,驱动器 D 上的最大路径是“D:\some 256-character path string”,其中“”表示当前系统代码页的不可见终止空字符。(字符 < > 在此处用于视觉清晰,不能作为有效路径字符串的一部分。)

路径限制:http: //msdn.microsoft.com/en-us/library/system.io.pathtoolongexception.aspx

已编辑

我写了一个简单的:将图像转换为b64并返回

//Convert image to b64
            string path = @"E:\Documents and Settings\Ali\Desktop\original.png";
            Image img = Image.FromFile(path);
            byte[] arr;
            using (MemoryStream ms = new MemoryStream())
            {
                img.Save(ms, ImageFormat.Jpeg);
                arr = ms.ToArray();
            }
            String b64 = Convert.ToBase64String(arr);//result:/9j/4AAQSkZJRgABAQEA...
            //Get image bytes
            byte[] originalimage= Convert.FromBase64String(b64);

将 b64 发送到您的函数并将其转换回来byte[] originalimage= Convert.FromBase64String(b64);

于 2013-04-05T05:04:10.900 回答