Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 6027367
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 23, 20262026-05-23T04:34:57+00:00 2026-05-23T04:34:57+00:00

I’m trying to POST some data as if I was using FORM on HTML

  • 0

I’m trying to POST some data as if I was using FORM on HTML site (ContentType = multipart/form-data). The target is amazon’s s3.
I’m using HttpWebRequest / HttpWebResponse and all seems kind of fine to me, but I still can’t fight one problem, I keep getting the error:

<?xml version="1.0" encoding="UTF-8"?>
<Error>
  <Code>InvalidArgument</Code>
  <Message>POST requires exactly one file upload per request.</Message>
  <ArgumentValue>0</ArgumentValue>
  <ArgumentName>file</ArgumentName>
</Error>

it seems to be self-describing, but I really do send the “file” field. I’ve managed to send a file with no problems through test web-site, the whole post-data seems to be exactly the same.
When I “spy” the request via wireshark all the headers and the post data as well – it’s there as expected.

Does anyone have any idea, why amazon can not see “file” field?

code used (it’s cut a bit to make it more readable):

private void addStringToStream(string buff, Stream s)
{
    var bytes = Encoding.UTF8.GetBytes(buff);
    s.Write(bytes, 0, bytes.Length);

    counter += bytes.Length;
}

private void doPost()
{
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);

    request.Method = "POST";
    request.ProtocolVersion = new Version(1, 1);

    request.KeepAlive = true;
    request.AllowAutoRedirect = true;

    request.Headers.Add("Accept-Language", "en-us,en;q=0.5");
    request.Headers.Add("Accept-Encoding", "gzip,deflate");
    request.Headers.Add("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7");

    request.Accept = "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
    request.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.10) Gecko/20071115 Firefox/2.0.0.10";

    string boundary = "---------------------------317205771417341028";
    request.ContentType = "multipart/form-data; boundary=" + boundary;

    request.SendChunked = false;
    request.Credentials = CredentialCache.DefaultCredentials;
    request.CookieContainer = new CookieContainer();

    request.ContentLength = calculateLength();

    using (Stream s = request.GetRequestStream())
    {
        boundary += "\n";

        string inLineContentH = "Content-Disposition: form-data; name=\"{0}\"";
        string contentH = "Content-Disposition: form-data; name=\"{0}\"" + "\n" + "\n";

        string keyH = "key";

        string aclH = "acl";
        string aclV = "public-read";

        string accessKeyH = "AWSAccessKeyId";
        string accessKeyV = publicKey;

        string policyH = "policy";
        string policyV = this.generatePolicy();

        string signatureH = "signature";
        string signatureV = generateSignature(policyV);

        string fileH = "file";
        string fileContentNameH = "filename=\"{0}\"";
        string contentType2H = "Content-Type: application/octet-stream";

        buff = boundary;
        addStringToStream(buff, s);

        buff = string.Format(contentH, keyH);
        addStringToStream(buff, s);

        buff = keyV + "\n";
        addStringToStream(buff, s);

        /* here are all of the others necessary fields added to stream just as the one above
        no other operations are used, just adding bytes to stream 
        and finally we get to the file: */

        buff = boundary;
        addStringToStream(buff, s);

        buff = string.Format(inLineContentH, fileH) + "; " + string.Format(fileContentNameH, Path.GetFileName(this.FilePath)) + "\n";
        addStringToStream(buff, s);

        buff = contentType2H + "\n" + "\n";
        addStringToStream(buff, s);

        var inStream = File.OpenRead(FilePath);
        int val;
        while ((val = inStream.ReadByte()) != -1)
        {
            s.WriteByte((byte)val);
            counter++;
        }

        buff = "\n";
        addStringToStream(buff, s);

        buff = boundary;
        addStringToStream(buff, s);

        buff = string.Format(contentH, "submit");
        addStringToStream(buff, s);

        buff = "Upload to Amazon S3" + "\n";
        addStringToStream(buff, s);

        buff = boundary.Replace("\r", "").Replace("\n", "") + "--";
        addStringToStream(buff, s);
    }

    request.GetResponse();
}

post data that goes to the stream:

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

webtest/image.png
---------------------------317205771417341028
Content-Disposition: form-data; name="acl"

public-read
---------------------------317205771417341028
Content-Disposition: form-data; name="AWSAccessKeyId"

AKIAJOQLTUC5H2NJ65NA
---------------------------317205771417341028
Content-Disposition: form-data; name="policy"

Oi8vd3d3Lmdvb2dsZS[...]c3QiXSwNCiAgXQ0KfQ0K
---------------------------317205771417341028
Content-Disposition: form-data; name="Signature"

06GBK5DJ71aB[...]M8Ct8JOE=
---------------------------317205771417341028
Content-Disposition: form-data; name="file"; filename="eclipse.png"
Content-Type: application/octet-stream

‰PNG

IHDRn
[...the rest of the image...]
IEND®B‚
---------------------------317205771417341028
Content-Disposition: form-data; name="submit"

Upload to Amazon S3
---------------------------317205771417341028--

and… the wireshark’s list:

OUT TCP 58383 > http [SYN] Seq=0 Win=8192 Len=0 MSS=1460 WS=2 SACK_PERM=1
IN  TCP http > 58383 [SYN, ACK] Seq=0 Ack=1 Win=8190 Len=0 MSS=1460 WS=6 SACK_PERM=1
OUT TCP 58383 > http [ACK] Seq=1 Ack=1 Win=65700 Len=0
OUT TCP [TCP segment of a reassembled PDU]
IN  HTTP    HTTP/1.1 100 Continue 
OUT TCP [TCP segment of a reassembled PDU]
OUT TCP [TCP segment of a reassembled PDU]
OUT TCP [TCP segment of a reassembled PDU]
OUT TCP [TCP segment of a reassembled PDU]
IN  TCP http > 58383 [ACK] Seq=26 Ack=2031 Win=1331456 Len=0
OUT TCP [TCP segment of a reassembled PDU]
OUT TCP [TCP segment of a reassembled PDU]
IN  TCP http > 58383 [ACK] Seq=26 Ack=3969 Win=1337344 Len=0
OUT TCP [TCP segment of a reassembled PDU]
OUT TCP [TCP segment of a reassembled PDU]
IN  TCP http > 58383 [ACK] Seq=26 Ack=6889 Win=1343232 Len=0
OUT TCP [TCP segment of a reassembled PDU]
OUT TCP [TCP segment of a reassembled PDU]
IN  TCP http > 58383 [ACK] Seq=26 Ack=8441 Win=1346048 Len=0
OUT HTTP    POST / HTTP/1.1
//the one above contains the last bytes added to the stream
IN  TCP http > 58383 [ACK] Seq=26 Ack=10225 Win=1348864 Len=0
IN  TCP http > 58383 [ACK] Seq=26 Ack=10857 Win=1351936 Len=0
IN  TCP http > 58383 [ACK] Seq=26 Ack=12162 Win=1354752 Len=0
IN  TCP http > 58383 [ACK] Seq=26 Ack=13622 Win=1357824 Len=0
IN  TCP http > 58383 [ACK] Seq=26 Ack=13913 Win=1360640 Len=0
IN  TCP [TCP segment of a reassembled PDU]
IN  HTTP/XML    HTTP/1.1 400 Bad Request 
//the one above includes the error info quoted in the beginning
IN  TCP http > 58383 [FIN, ACK] Seq=649 Ack=13913 Win=1360640 Len=0
OUT TCP 58383 > http [ACK] Seq=13913 Ack=650 Win=65052 Len=0
OUT TCP 58383 > http [FIN, ACK] Seq=13913 Ack=650 Win=65052 Len=0
IN  TCP http > 58383 [ACK] Seq=650 Ack=13914 Win=1360640 Len=0

the only difference between above report and one generated by web-app based upload is that web-app based has less [TCP segment of a reassembled PDU] positions, and has some [TCP Dup ACK 156#1] http > 58364 [ACK] Sq=1 Ack=7017 Win=11668 Len=0 entries (if might be helpful I can send full traces).

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-23T04:34:58+00:00Added an answer on May 23, 2026 at 4:34 am

    solved!
    the boundary was wrong – it is needed to add 2 dashes more for post data than the value in the header has.
    what was needed to do in above code was:

    string boundary = "---------------------------317205771417341028";
    request.ContentType = "multipart/form-data; boundary=" + boundary;
    

    […]

    using (Stream s = request.GetRequestStream())
    {
        boundary = "--" + boundary "\n";
    

    […]
    so easy… and yet so annoying…

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I'm trying to decode HTML entries from here NYTimes.com and I cannot figure out
I'm new to using the Perl treebuilder module for HTML parsing and can't figure
link Im having trouble converting the html entites into html characters, (&# 8217;) i
I have some data like this: 1 2 3 4 5 9 2 6
I am trying to understand how to use SyndicationItem to display feed which is
Basically, what I'm trying to create is a page of div tags, each has
That's pretty much it. I'm using Nokogiri to scrape a web page what has
I have just tried to save a simple *.rtf file with some websites and
I am trying to loop through a bunch of documents I have to put
I'm parsing an RSS feed that has an &#8217; in it. SimpleXML turns this

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.