- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试发布一些数据,就好像我在 HTML 站点上使用 FORM (ContentType = multipart/form-data)。目标是亚马逊的s3。我正在使用 HttpWebRequest/HttpWebResponse,对我来说一切似乎都很好,但我仍然无法解决一个问题,我不断收到错误消息:
<?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>
好像是自述的,不过我真的是把"file"字段发过去了。我已经成功地通过测试网站发送了一个没有问题的文件,整个后期数据似乎完全一样。当我通过 wireshark“监视”请求时,所有 header 和发布数据也都出现了 - 它如预期的那样存在。
有谁知道为什么亚马逊看不到"file"字段?
使用的代码(它被删减了一点以使其更具可读性):
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();
}
发布到流的数据:
---------------------------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--
还有...wireshark 的列表:
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
上述报告与基于网络应用程序的上传生成的报告之间的唯一区别在于,基于网络应用程序的[重组 PDU 的 TCP 段] 位置较少,并且有一些 [TCP Dup ACK 156#1] http > 58364 [ACK] Sq=1 Ack=7017 Win=11668 Len=0 条目(如果可能有帮助,我可以发送完整的跟踪)。
最佳答案
解决了!边界是错误的 - 需要为发布数据添加比 header 中的值多 2 个破折号。上面的代码需要做的是:
string boundary = "---------------------------317205771417341028";
request.ContentType = "multipart/form-data; boundary=" + boundary;
[...]
using (Stream s = request.GetRequestStream())
{
boundary = "--" + boundary "\n";
[...]如此简单……但又如此烦人……
关于.net - 带有 HttpWebRequest 的 HTTP POST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6030371/
我正在使用 HttpWebRequest 登录页面并获取一些信息。然后,我使用该信息创建一个新的 HttpWebRequest 以获取更多信息。我不想使用 WebClient。 如何将使用第一个 Ht
我有一个包含指向某些文件的链接的页面。 我基本上需要访问页面的源代码来解析它并获取文件的所有超链接。 我的代码是这样的(我在网上很多地方都找到了一些代码..): "private static
我正在编写一个渐进式下载器作为可移植类库 (Profile=24)。它将支持以字节 block 的形式部分下载目标文件。 HttpClient 不可用,我将使用 HttpWebRequest,它具有用
我正在努力在 HttpWebRequest 之上构建一个流畅的 REST 客户端界面。/HttpWebResponse .NET 中的类型。到目前为止,一切都很好......但是我正在尝试开发一个可插
我有一个用 VB.NET 编写的应用程序( 不是 asp.net,它是一个 Windows 控制台应用程序)。我正在尝试调用一个 url(一个 html 页面)并将响应返回到一个字符串中。响应是直接的
我尝试使用 C# HTTPWebRequest 类登录 amazon.com,我可以登录但无法读取 header 中的多个 set-cookie 当服务器响应多个“Set-Cookie:”-heade
我正在测试 Web 核心 API,但收到 500 内部服务器错误。 我的 Controller 上的方法是; [Route("api/property")] public class Property
假设我正在检索一个 url,如下所示: string url = "http://www.somesite.com/somepage.html" HttpWebRequest req = (HttpW
当我使用 HttpWebRequest.Headers.Add("Cookie",value) 与 HttpWebRequest.CookieContainer 和结果从 HttpWebRequest
我已阅读以下 2 篇文章并尝试实现相同的文章。 我的代码是这样的,超时发生在这里 HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(url);
我正在寻找一种使用 httpWebRequest 从 url 下载 excel 文件并以某种方式解析它的方法 - 这是否意味着将其转换为 .csv 文件,以便我可以简单地使用 TextFieldPar
当我尝试序列化 HttpWebRequest 时出现以下错误 Type 'System.Net.KnownHttpVerb' in Assembly 'System, Version=2.0.0.0,
我目前正在下载一个 HTML 页面,使用以下代码: Try Dim req As System.Net.HttpWebRequest = DirectCast(WebRequest.Creat
我读了这个 MSDN 喜欢它并运行它的例子。 http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.useragent.a
我有一个 ASP.NET MVC 操作,它通过 HttpWebRequest 将 GET 请求发送到另一台服务器。我想在新请求中包含原始操作请求中的所有 cookie。原始请求中的一些 System.
我正在尝试抓取具有用户身份验证的网站。我能够执行POST来发送登录信息并存储Cookie。但是,登录后,尝试访问 protected 页面时出现403错误。 $url = "https://some_
我正在使用 HttpWebRequest ,并且正在处理响应流。 HttpWebRequest是否有正确的处理方法? ,因为它不包含 close 或 dispose 方法? 最佳答案 如果该类有特殊的
我在REST服务中抛出一个错误,例如: throw new WebFaultException("bla bla bla", HttpStatusCode.HttpVersionNotSuppo
问题:此控制台应用调用 Azure 上托管的长时间运行的网页两次。我希望它只调用一次。 控制台应用程序因捕获的异常而失败:基础连接已关闭:接收时发生意外错误。 so question 如果我从 Chr
我试图弄清楚我的网络请求在最终到达最终内容之前被重定向了多少次。 我正在创建我的网络请求,如下所示: var httpRequest = (HttpWebRequest) WebRequest.Cre
我是一名优秀的程序员,十分优秀!