我用这段代码将图片上传到ftp。但是图像已损坏。
尝试上传的图片是Base64
string.i转换为流并将其传递给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个字符。
请有人帮忙解决这个问题。
答案 0 :(得分: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();
}
答案 1 :(得分:1)
您应该使用Stream来读取二进制文件,而不是StreamReader。 StreamReader仅用于读取文本文件。
和关于错误Maximum Path Length Limitation
最大路径长度限制在Windows API中(有一些 以下段落中讨论的例外情况),最大长度 对于路径是MAX_PATH,定义为260个字符。本地人 path按以下顺序构成:驱动器号,冒号, 反斜杠,名称由反斜杠分隔的组件和终止 空字符。例如,驱动器D上的最大路径是“D:\ some 256个字符的路径字符串“where”“表示不可见的 终止当前系统代码页的空字符。 (该 字符< >这里使用的是视觉清晰度,不能成为其中的一部分 一个有效的路径字符串。)
路径限制: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);