简体   繁体   English

使用HttpWebRequest上传文件(multipart / form-data)

[英]using HttpWebRequest upload file (multipart/form-data)

I was trying to upload file to web server through API but i got error "The remote server returned an error: (403) Forbidden." 我试图通过API将文件上传到Web服务器,但出现错误“远程服务器返回错误:(403)禁止。” I also try upload file via postman and it was successful.Below my code uploading file and postman preview. 我也尝试通过邮递员上传文件,这是成功的。在我的代码上传文件和邮递员预览下面。

   public static void HttpUploadFile(string url, string file, string paramName, string contentType, NameValueCollection nvc)
    {
        MessageBox.Show(string.Format("Uploading {0} to {1}", file, url));
        var boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x");
        var boundarybytes = Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");

        var wr = (HttpWebRequest)WebRequest.Create(url);
        wr.ContentType = "multipart/form-data; boundary=" + boundary;
        wr.Method = "POST";
        wr.KeepAlive = true;
        wr.Credentials = CredentialCache.DefaultCredentials;

        var rs = wr.GetRequestStream();

        const string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}";
        foreach (string key in nvc.Keys)
        {
            rs.Write(boundarybytes, 0, boundarybytes.Length);
            var formitem = string.Format(formdataTemplate, key, nvc[key]);
            byte[] formitembytes = Encoding.UTF8.GetBytes(formitem);
            rs.Write(formitembytes, 0, formitembytes.Length);
        }
        rs.Write(boundarybytes, 0, boundarybytes.Length);

        const string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: {2}\r\n\r\n";
        var header = string.Format(headerTemplate, paramName, file, contentType);
        var headerbytes = Encoding.UTF8.GetBytes(header);
        rs.Write(headerbytes, 0, headerbytes.Length);

        var fileStream = new FileStream(file, FileMode.Open, FileAccess.Read);
        var buffer = new byte[4096];
        var bytesRead = 0;
        while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
        {
            rs.Write(buffer, 0, bytesRead);
        }
        fileStream.Close();

        var trailer = Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");
        rs.Write(trailer, 0, trailer.Length);
        rs.Close();

        WebResponse wresp = null;
        try
        {
            wresp = wr.GetResponse();
            var stream2 = wresp.GetResponseStream();
            var reader2 = new StreamReader(stream2);
            MessageBox.Show(string.Format("Response is: {0}", reader2.ReadToEnd()));
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error uploading file" + ex);
            if (wresp != null)
            {
                wresp.Close();
                wresp = null;
            }
        }
        finally
        {
            wr = null;
        }
    }

this is postman preview 这是邮递员预览

POST / HTTP/1.1
Host: buckname.s3.amazonaws.com
Cache-Control: no-cache

----WebKitFormBoundaryE19zNvXGzXaLvS5C
Content-Disposition: form-data; name="key"

2014/6b9830b098c9871c6356a5e55af91bfd/${filename}
----WebKitFormBoundaryE19zNvXGzXaLvS5C
Content-Disposition: form-data; name="AWSAccessKeyId"

AKIAJNXK6LUBUSZBXJIQ
----WebKitFormBoundaryE19zNvXGzXaLvS5C
Content-Disposition: form-data; name="acl"

public-read
----WebKitFormBoundaryE19zNvXGzXaLvS5C
Content-Disposition: form-data; name="policy"

eyJleHBpcmF0aW9uIjoiMjAxNC0wOC0yMlQxMDo1MTow
----WebKitFormBoundaryE19zNvXGzXaLvS5C
Content-Disposition: form-data; name="signature"

ezYsOF/P6bGcOqQdyJeE7iApu2A=
----WebKitFormBoundaryE19zNvXGzXaLvS5C
Content-Disposition: form-data; name="success_action_status"

201
----WebKitFormBoundaryE19zNvXGzXaLvS5C
Content-Disposition: form-data; name="secure"

true
----WebKitFormBoundaryE19zNvXGzXaLvS5C
Content-Disposition: form-data; name="x-amz-storage-class"

REDUCED_REDUNDANCY
----WebKitFormBoundaryE19zNvXGzXaLvS5C
Content-Disposition: form-data; name="file"; filename="exp.png"
Content-Type: image/png


----WebKitFormBoundaryE19zNvXGzXaLvS5C
Content-Disposition: form-data; name="Content-Type"

image/jpeg
----WebKitFormBoundaryE19zNvXGzXaLvS5C

edit (code sending) 编辑 (发送代码)

  var nvc = new NameValueCollection
        {
            {"AWSAccessKeyId", fields.AWSAccessKeyId},
            {"Content-Type", "image/jpeg"},
            {"acl", fields.acl},
            {"key", fields.key},
            {"policy", fields.policy},
            {"secure", secure.ToString()},
            {"signature", signature},
            {"success_action_status", fields.success_action_status},
            {"x-amz-storage-class", "REDUCED_REDUNDANCY"}
        };

 HttpUploadHelper.HttpUploadFile(responsFieldsDeSerial.url.ToString(),@"C:\1.png", "file", "image/jpeg",nvc);

thank you! 谢谢!

My error was 我的错误是

<?xml version="1.0" encoding="UTF-8"?> <Error><Code>AccessDenied</Code><Message>Invalid              according to Policy: Policy Condition failed: ["eq", "$Secure", "true"]</Message>

Problem was value of field (in my case : secure) case senstive i tried to post True but it must be true . 问题是字段的值(在我的情况下为:secure)对大小写敏感,我试图发布True,但必须为true

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 使用多部分/表单数据上传文件 - File upload using multipart/form-data 使用HttpWebRequest使用multipart / form-data POST数据/上传图像 - Using HttpWebRequest to POST data/upload image using multipart/form-data 使用 Python 通过 POST 多部分表单数据上传文件 - Upload file via POST multipart form-data using Python 如何在Restsharp中使用multipart / form-data上传XML文件? - How to upload an XML file using multipart/form-data with Restsharp? 在C#中使用RestClient作为多部分/表单数据上传文件 - Upload File using RestClient as multipart/form-data in c# HttpWebRequest发送具有Windows Phone的multipart / form-data的文件 - HttpWebRequest Send File with multipart/form-data for Windows Phone 使用HTTPWebrequest(multipart / form-data)发布文件时出现错误(从客户端检测到潜在的Request.Form值) - Post a file using HTTPWebrequest (multipart/form-data) gives an error (A potentially dangerous Request.Form value was detected from the client) c#.NET multipart / form-data上传文件 - c# .NET multipart/form-data Upload A File 使用 multipart/form-data 在服务器中上传文件 - C# - Upload file in server with a multipart/form-data - C# 如何使用 HTTP POST multipart/form-data 将文件上传到服务器? - How to upload file to server with HTTP POST multipart/form-data?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM