Отправить поток через сообщение - PullRequest
0 голосов
/ 19 апреля 2011

Я пытаюсь отправить фотографию по почте и нашел класс, который это делает, но из объекта FileInfo. Мне нужно изменить этот класс, чтобы отправить поток (возвращаемый photoChooserTask), и я не знаю как. Вот класс:

public class DataContractMultiPartSerializer  
{  
  private string boundary;  
  public DataContractMultiPartSerializer(string boundary)  
  {  
      this.boundary = boundary;  
  }  

 private void WriteEntry(StreamWriter writer, string key, object value)  
 {  
     if (value != null)  
     {  
         writer.Write("--");  
         writer.WriteLine(boundary);  
         if (value is FileInfo)  
         {  

             FileInfo f = value as FileInfo;  
             writer.WriteLine(@"Content-Disposition: form-data; name=""{0}""; ilename=""{1}""", key, f.Name);  
             writer.WriteLine("Content-Type: application/octet-stream");  
             writer.WriteLine("Content-Length: " + f.Length);  
             writer.WriteLine();  
             writer.Flush();  
             Stream output = writer.BaseStream;  
             Stream input = f.OpenRead();  
             byte[] buffer = new byte[4096];  
             for (int size = input.Read(buffer, 0, buffer.Length); size > 0; size = nput.Read(buffer, 0, buffer.Length))  
             {  
                 output.Write(buffer, 0, size);  
             }  
             output.Flush();  
             writer.WriteLine();  
         }  
         else  
         {  
             writer.WriteLine(@"Content-Disposition: form-data; name=""{0}""", key);  
             writer.WriteLine();  
             writer.WriteLine(value.ToString());  
         }  
     }  
 }  

Я пытался изменить это так:

    if (value is Stream)
    {
        //FileInfo f = value as FileInfo;
        FileStream f = value as FileStream;

        writer.WriteLine(@"Content-Disposition: form-data; name=""{0}""; filename=""{1}""", key, "sentPhoto.jpg");
        writer.WriteLine("Content-Type: application/octet-stream");
        writer.WriteLine("Content-Length: " + f.Length);
        writer.WriteLine();
        writer.Flush();
        Stream output = writer.BaseStream;
        //Stream input = f.OpenRead();
        byte[] buffer = new byte[4096];

        for (int size = input.Read(buffer, 0, buffer.Length); size > 0; size = nput.Read(buffer, 0, buffer.Length))
        {
            output.Write(buffer, 0, buffer.Length);
        }
        output.Flush();
        writer.WriteLine();
    }
    else
    {
        writer.WriteLine(@"Content-Disposition: form-data; name=""{0}""", key);
        writer.WriteLine();
        writer.WriteLine(value.ToString());
    }

но он не входит в цикл for, потому что размер равен 0. Кто-нибудь может дать мне подсказку?

Большое спасибо

1 Ответ

0 голосов
/ 20 апреля 2011

Я преобразовал функцию в это:

private void WriteEntry(StreamWriter writer, string key, object value)
    {
        if (value != null)
        {
            writer.Write("--");
            writer.WriteLine(boundary);
            if (value is byte[])
            {
                byte[] ba = value as byte[];

                writer.WriteLine(@"Content-Disposition: form-data; name=""{0}""; filename=""{1}""", key, "sentPhoto.jpg");
                writer.WriteLine(@"Content-Type: application/octet-stream");
                writer.WriteLine(@"Content-Length: " + ba.Length);
                writer.WriteLine();
                writer.Flush();
                Stream output = writer.BaseStream;

                output.Write(ba, 0, ba.Length);
                output.Flush();
                writer.WriteLine();
            }
            else
            {
                writer.WriteLine(@"Content-Disposition: form-data; name=""{0}""", key);
                writer.WriteLine();
                writer.WriteLine(value.ToString());
            }
        }
    }

Сейчас я уже передаю байтовый массив и пишу его одним куском Делая то, что я делал с Stream, я получал только испорченные изображения.

Надеюсь, это кому-нибудь поможет

...