C# HttpWebRequest发布AWS文件上载请求的参数,导致400错误
我正在尝试将文件从我的Unity游戏上载到我的AWS帐户。可在此处找到执行此操作的表格。之前我使用的是C# HttpWebRequest发布AWS文件上载请求的参数,导致400错误,c#,amazon-web-services,unity3d,amazon-s3,httpwebrequest,C#,Amazon Web Services,Unity3d,Amazon S3,Httpwebrequest,我正在尝试将文件从我的Unity游戏上载到我的AWS帐户。可在此处找到执行此操作的表格。之前我使用的是FILEUPLOAD\u BASE\u URLto be“”,它不需要密钥来上传文件(链接)。但是,AWS文件上载需要一个键参数,其值可以是“/${filename}”。我将该值指定为sb.Append(“key:AffectivaLogs/${filename}”)如下所示,但请求抛出400错误。这是将密钥指定为post请求参数的正确方法吗 private string FILEUPLOAD_
FILEUPLOAD\u BASE\u URL
to be“”,它不需要密钥来上传文件(链接)。但是,AWS文件上载需要一个键参数,其值可以是“/${filename}”。我将该值指定为sb.Append(“key:AffectivaLogs/${filename}”)代码>如下所示,但请求抛出400错误。这是将密钥指定为post请求参数的正确方法吗
private string FILEUPLOAD_BASE_URL = "http://gameexperiencesurvey.s3.amazonaws.com/";
public void uploadToDrive()
{
string[] files = Directory.GetFiles(".", "*.txt");
for (int i = 0; i < files.Length; i++)
{
string boundary = "----------" + DateTime.Now.Ticks.ToString("x");
ServicePointManager.ServerCertificateValidationCallback = MyRemoteCertificateValidationCallback;
HttpWebRequest webrequest = (HttpWebRequest)WebRequest.Create(FILEUPLOAD_BASE_URL);
webrequest.ContentType = "multipart/form-data; boundary=" + boundary;
webrequest.Method = "POST";
// Build up the post message header
StringBuilder sb = new StringBuilder();
sb.Append("--");
sb.Append(boundary);
sb.Append("\r\n");
sb.Append("key: AffectivaLogs/${filename}"); // is this how it should be?
sb.Append("\r\n");
sb.Append("Content-Disposition: form-data; name=\"");
sb.Append("file"); // file form name
sb.Append("\"; filename=\"");
sb.Append(Path.GetFileName(files[i]));
sb.Append("\"");
sb.Append("\r\n");
sb.Append("Content-Type: ");
sb.Append("text/plain");
sb.Append("\r\n");
sb.Append("\r\n");
string postHeader = sb.ToString();
byte[] postHeaderBytes = Encoding.UTF8.GetBytes(postHeader);
// Build the trailing boundary string as a byte array
// ensuring the boundary appears on a line by itself
byte[] boundaryBytes = Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");
FileStream fileStream = new FileStream(files[i], FileMode.Open, FileAccess.Read);
long length = postHeaderBytes.Length + fileStream.Length + boundaryBytes.Length;
webrequest.ContentLength = length;
Stream requestStream = webrequest.GetRequestStream();
// Write out our post header
requestStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);
// Write out the file contents
byte[] buffer = new Byte[checked((uint)Math.Min(4096, (int)fileStream.Length))];
int bytesRead = 0;
while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
requestStream.Write(buffer, 0, bytesRead);
// Write out the trailing boundary
requestStream.Write(boundaryBytes, 0, boundaryBytes.Length);
try
{
WebResponse response = webrequest.GetResponse();
Stream s = response.GetResponseStream();
StreamReader sr = new StreamReader(s);
}
catch (Exception e)
{
Debug.Log("Error occured .... " + e.Message);
}
}
}
public bool MyRemoteCertificateValidationCallback(System.Object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
bool isOk = true;
// If there are errors in the certificate chain, look at each error to determine the cause.
if (sslPolicyErrors != SslPolicyErrors.None)
{
for (int i = 0; i < chain.ChainStatus.Length; i++)
{
if (chain.ChainStatus[i].Status != X509ChainStatusFlags.RevocationStatusUnknown)
{
chain.ChainPolicy.RevocationFlag = X509RevocationFlag.EntireChain;
chain.ChainPolicy.RevocationMode = X509RevocationMode.Online;
chain.ChainPolicy.UrlRetrievalTimeout = new TimeSpan(0, 1, 0);
chain.ChainPolicy.VerificationFlags = X509VerificationFlags.AllFlags;
bool chainIsValid = chain.Build((X509Certificate2)certificate);
if (!chainIsValid)
{
isOk = false;
}
}
}
}
return isOk;
}
private string FILEUPLOAD\u BASE\u URL=”http://gameexperiencesurvey.s3.amazonaws.com/";
public void uploadToDrive()
{
字符串[]files=Directory.GetFiles(“.”,“*.txt”);
for(int i=0;i
错误如下:
昨天我试图使用WWWForm和WWW上传文件,我遇到了一个问题,将二进制数据添加到WWWForm无法工作。似乎为了让WWWForm工作,您需要在表单中同时包含二进制和非二进制数据。因此,下面的解决方案奏效了
public void uploadToAWS()
{
fileNameList = "";
string[] files = Directory.GetFiles(".", "*.txt");
for (int i = 0; i < files.Length; i++)
{
WWWForm AWSform = new WWWForm();
AWSform.AddField("key", "AffectivaLogs/${filename}");
AWSform.AddBinaryData("file", File.ReadAllBytes(files[i]), files[i], "text/plain");
StartCoroutine(Post(FILEUPLOAD_BASE_URL, AWSform));
fileNameList += files[i].Replace(@".\", "") + " || ";
}
}
IEnumerator Post(string url, WWWForm form)
{
WWW www = new WWW(url, form);
float elapsedTime = 0.0f;
while (!www.isDone)
{
elapsedTime += Time.deltaTime;
//Matrix4x4 wait time is 20s
if (elapsedTime >= 20f)
{
break;
}
yield return null;
}
if (!www.isDone || !string.IsNullOrEmpty(www.error))
{
Debug.LogError("Connection error while sending analytics... Error:" + www.error);
// Error handling here.
yield break;
}
if (www.isDone)
{
Debug.Log("Data Sent successfully.");
yield break;
}
}
public void uploadToAWS()
{
fileNameList=“”;
字符串[]files=Directory.GetFiles(“.”,“*.txt”);
for(int i=0;i=20f)
{
打破
}
收益返回空;
}
如果(!www.isDone | |!string.IsNullOrEmpty(www.error))
{
LogError(“发送分析时出现连接错误…错误:+www.error”);
//这里的错误处理。
屈服断裂;
}
国际单项体育联合会(www.isDone)
{
Log(“数据已成功发送”);
屈服断裂;
}
}
有一个官方的amazon-s3 Unity插件。使用它,而不是重写整个API。我不知道,我