通过帖子发送流

发布于 2024-11-02 07:15:07 字数 2630 浏览 4 评论 0原文

我正在尝试通过帖子发送照片,并且找到了一个可以执行此操作的类,但是来自 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。 谁能给我一个线索吗?

非常感谢

I'm trying to send a photo through post and I've found a class that does it, but from a FileInfo object. I need to change this class in order to send a Stream (returned by the photoChooserTask) and I don't know how. Here's the class:

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());  
         }  
     }  
 }  

I've tried to change it this way:

    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());
    }

but it does not enter to the for loop because size is 0.
Can anyone give me a clue?

Thank you very much

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

知你几分 2024-11-09 07:15:07

我已将函数转换为:

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());
            }
        }
    }

现​​在我已经传递了一个字节数组,并将其写在一块中。做我对流所做的事情时,我只得到损坏的图像。

我希望它能帮助某人

I've converted the function to this:

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());
            }
        }
    }

Now I'm passing already a bytearray and I write it in one piece. Doing what I was doing with the Stream I only got corrupted images.

I hope it helps someone

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文