我想将.json文件作为文件上传到服务器。我正在使用C#构建UWP应用。我使用Windows.Web.Http.HttpClient
发出POST请求。发布请求返回200,但文件未上传。 URL链接到公司网络托管平台上的文件夹。如果我检查页面或bluehost cpanel页面,则没有最新的文件上传与应用程序的成功请求相对应。如何将文件上传到服务器?我需要提供登录凭证吗? Microsoft UWP甚至不再支持FTP吗?它真的只希望我使用HttpClient
。
我尝试了各种方法,但是这种方法(我主要是从Microsoft的示例C ++代码中翻译过来的,用于上传一个简单的文件)是它第一次没有返回405或仅转储url的内容。我尝试使用HttpWebRequest
格式和System.Net.Http
前缀。
fileOpenPicker.FileTypeFilter.Add(".json");
IStorageFile jsonFile = await fileOpenPicker.PickSingleFileAsync();
IRandomAccessStream stream = await jsonFile.OpenAsync(FileAccessMode.Read);
Windows.Web.Http.HttpStreamContent jsonContent = new HttpStreamContent(stream);
jsonContent.Headers.Append("Content-Type", "application/json");
Windows.Web.Http.Headers.HttpContentDispositionHeaderValue disposition = new Windows.Web.Http.Headers.HttpContentDispositionHeaderValue("form-data");
jsonContent.Headers.ContentDisposition = disposition;
disposition.Name ="fileForUpload";
disposition.FileName = "testSurveyFile.json";
Windows.Web.Http.HttpMultipartFormDataContent postContent = new HttpMultipartFormDataContent();
postContent.Add(jsonContent); // Add the binary data content as a part of the form data content.
Windows.Web.Http.HttpResponseMessage httpResponseMessage;
string httpResponseBody;
try
{
// Send the POST request.
Uri requestUri = new Uri(uploadurl);
Windows.Web.Http.HttpClient httpClient = new Windows.Web.Http.HttpClient();
httpResponseMessage = await httpClient.PostAsync(requestUri, postContent);
httpResponseMessage.EnsureSuccessStatusCode();
Debug.WriteLine(httpResponseMessage);
httpResponseBody = httpResponseMessage.Content.ReadAsStringAsync().GetResults();
}
catch (Exception ex)
{
Debug.WriteLine(ex);
}
这是httpResponseMessage
返回的内容:
StatusCode: 200,
ReasonPhrase: '',
Version: 3,
Content: Windows.Web.Http.HttpStreamContent,
Headers:
{
server: nginx/1.14.1
cache-control: no-store, no-cache, must-revalidate
set-cookie: PHPSESSID=4f21dec8695cea2b75d009c47d9b94bb; path=/
date: Fri, 02 Aug 2019 15:28:34 GMT
pragma: no-cache
}{
content-type: text/html; charset=UTF-8
expires: Thu, 19 Nov 1981 08:52:00 GMT
}
但该位置没有新文件。
为澄清起见,文件托管在bluehost上。如果我不能定期发布到bluehost(例如,我可以使用此站点:http://ptsv2.com/t/gizn2-1564768263/d/373971039#),那我该如何解决?它是一个https://
前缀,是否表示我需要ssl的凭据或证书?我在哪里或如何找到?
这是httpResponseBody的输出,testSurveyFile.json文件是旧文件,此上载旨在替换或覆盖。这是正确的索引。我希望这些信息能解决一些问题。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<head>
<title>Index of /npjTest/SurveyStuff</title>
</head>
<body>
<h1>Index of /npjTest/SurveyStuff</h1>
<table>
<tr><th valign="top"> </th><th><a href="?C=N;O=D">Name</a></th><th><a href="?C=M;O=A">Last modified</a></th><th><a href="?C=S;O=A">Size</a></th><th><a href="?C=D;O=A">Description</a></th></tr>
<tr><th colspan="5"><hr></th></tr>
<tr><td valign="top"> </td><td><a href="/npjTest/">Parent Directory</a> </td><td> </td><td align="right"> - </td><td> </td></tr>
<tr><td valign="top"> </td><td><a href="TestSurvey0/">TestSurvey0/</a> </td><td align="right">2019-07-26 11:51 </td><td align="right"> - </td><td> </td></tr>
<tr><td valign="top"> </td><td><a href="blankHTMLPage.html">blankHTMLPage.html</a> </td><td align="right">2019-07-22 10:25 </td><td align="right">4.7K</td><td> </td></tr>
<tr><td valign="top"> </td><td><a href="composer.json">composer.json</a> </td><td align="right">2019-07-15 08:00 </td><td align="right"> 60 </td><td> </td></tr>
<tr><td valign="top"> </td><td><a href="composer.lock">composer.lock</a> </td><td align="right">2019-07-15 08:00 </td><td align="right">2.2K</td><td> </td></tr>
<tr><td valign="top"> </td><td><a href="error_log">error_log</a> </td><td align="right">2019-07-31 09:19 </td><td align="right">9.5K</td><td> </td></tr>
<tr><td valign="top"> </td><td><a href="surveyConfig.php">surveyConfig.php</a> </td><td align="right">2019-07-30 10:12 </td><td align="right">675 </td><td> </td></tr>
<tr><td valign="top"> </td><td><a href="surveyFinalPage.php">surveyFinalPage.php</a> </td><td align="right">2019-07-31 14:35 </td><td align="right"> 12K</td><td> </td></tr>
<tr><td valign="top"> </td><td><a href="surveyLogic.php">surveyLogic.php</a> </td><td align="right">2019-07-31 14:34 </td><td align="right">9.8K</td><td> </td></tr>
<tr><td valign="top"> </td><td><a href="testSurveyFile.json">testSurveyFile.json</a> </td><td align="right">2019-07-31 14:37 </td><td align="right">4.0K</td><td> </td></tr>
<tr><td valign="top"> </td><td><a href="testSurveyPage.html">testSurveyPage.html</a> </td><td align="right">2019-07-22 12:18 </td><td align="right">4.7K</td><td> </td></tr>
<tr><td valign="top"> </td><td><a href="vendor/">vendor/</a> </td><td align="right">2019-07-15 07:59 </td><td align="right"> - </td><td> </td></tr>
<tr><td valign="top"> </td><td><a href="vendorZIP2.zip">vendorZIP2.zip</a> </td><td align="right">2019-07-15 07:58 </td><td align="right">2.6M</td><td> </td></tr>
<tr><th colspan="5"><hr></th></tr>
</table>
<address>Apache Server at ___________.com Port 443</address>
</body></html>
似乎我应该执行HTTP PUT请求而不是POST。我已经考虑过了,尝试改为运行PutAsync,但是遇到了与重定向相关的错误。具体来说,如果我将AllowAutoRedirect设置为false(以绕过指出“ HTTP重定向请求必须由用户确认”的错误),它将返回301响应代码。我不确定为什么要重定向。当我发送uri时,该uri应该转到索引(/ SurveyStuff)还是我要覆盖的文件(/SurveyStuff/testSurveyFile.json)?
如果我将以/SurveyStuff/testSurveyFile.json结尾的uri用于PUT请求,则会收到405(不允许)响应。我意识到这是我从一开始就应该做的事情,尽管我在来这里之前就尝试过。 Postman和我的应用程序均返回了此响应。出于安全目的,bluehost阻止了该请求吗?我已经尝试过各种FTP和站点凭据,但是它们并没有改变。
答案 0 :(得分:0)
免责声明:我必须承认我对Windows.Web.Http.HttpClient知之甚少。这是一些潜在的修复程序,如果这些修复程序不起作用,则可以使用其他解决方案。
405问题:
凭证问题: 尽管这很奇怪,但是因为通常您会收到401(未经授权)错误代码,所以为了安全起见,您可能希望包括凭据。
查看是否要使用Windows.Web.Http.HttpClient或 System.Net.Http.HttpClient(differences)。
对于System.Net.Http.HttpClient凭据:
var httpClientHandler = new HttpClientHandler()
{
Credentials = new NetworkCredential(username, password, domainName),
};
var httpClient = new HttpClient(httpClientHandler);
解决方案1:System.Net.Http.HttpClient多格式数据(this)。
IInputStream inputStream = await file.OpenAsync(FileAccessMode.Read);
HttpMultipartFormDataContent multipartContent = new HttpMultipartFormDataContent();
multipartContent.Add(new HttpStreamContent(inputStream),"myFile",file.Name);
HttpClient client = new HttpClient();
HttpResponseMessage response = await client.PostAsync(uri,multipartContent);
解决方案2 System.Net.Http.HttpClient多部分数据(this)。
在他将图像上传为字节数组时,您必须进行一些调整,我建议使用更多的Using语句,因为它们会自动处理对象。
如果愿意,可以将文件转换为字节数组:
byte[] bytes = System.IO.File.ReadAllBytes(filename);
解决方案3:如果这些方法不起作用,则可以尝试一些替代方法:
我希望这至少会使您走上正确的路:)。
答案 1 :(得分:0)
我第二次谈到了bluehost支持,这次他们说bluehost不支持来自任何外部来源(包括Postman)的HTTP POST请求。看来我需要找到另一个地方托管此文件。对于这一点的困惑,我深表歉意。我很感谢您的帮助,因为它可以帮助我更好地理解HTTP请求和Web编程。非常感谢你。