2013-04-05 2 views
2

Я использовал этот код для загрузки изображения на ftp. но изображение повреждено. image im пытается загрузить файл Base64 string.i, преобразованный в поток и переданный в UpLoadImage.изображение повреждено при загрузке ftp с использованием ftpwebrequest

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 РДР = новый StreamReader (изображение); байт [] fileData = Encoding.UTF8.GetBytes (rdr.ReadToEnd()); rdr.Close();

, если я использую byte[] fileData = File.ReadAllBytes(image); он дает мне ошибку, имя файла более 260 символов.

Пожалуйста, может кто-то помочь решить эту проблему ..

ответ

1

Вы должны использовать поток для чтения двоичных файлов, а не StreamReader. StreamReader предназначен для чтения текстовых файлов.

и об ошибке Maximum Path Length Limitation

Максимальная длина пути Ограничение В API Windows (с некоторыми исключениями, описанных в следующих пунктах), максимальная длина для пути является MAX_PATH, который определяется как 260 символов , Локальный путь структурирован в следующем порядке: буква диска, двоеточие, обратная косая черта, компоненты имени, разделенные обратными косыми чертами, и завершающий знак нулевой буквы . Например, максимальный путь на диске D «D: \ some » строка с 256 символами пути », где« »представляет невидимый конечный нулевой символ для текущей кодовой страницы системы. (В символы <> здесь используются для наглядности и не может быть частью действительной строки пути.)

путь limition: 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);

+1

байт [] FileData = File.ReadAllBytes (изображение) требует строку в качестве параметра. – user2226345

+0

@ user2226345: File.ReadAllBytes («адрес вашего изображения»), я думаю, что ваш путь> 260 charachter – KF2

+0

, когда я передаю строку base64 в файл.ReadAllBytes (изображение) показывает ошибку, что имя файла или путь длинный (имеет более 260 символов). – user2226345

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(); 
     } 
Смежные вопросы