使用 HttpClient POST 请求上传文件返回 200,但文件未上传

诺亚

我想将 .json 文件作为文件上传到服务器。我正在使用 C# 构建一个 UWP 应用程序。我使用 POST 请求Windows.Web.Http.HttpClient发布请求返回 200,但文件未上传。该 URL 链接到公司 Web 托管平台上的文件夹。如果我检查页面或 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://前缀,s 是否意味着我需要 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">&nbsp;</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">&nbsp;</td><td><a href="/npjTest/">Parent Directory</a>       </td><td>&nbsp;</td><td align="right">  - </td><td>&nbsp;</td></tr>
<tr><td valign="top">&nbsp;</td><td><a href="TestSurvey0/">TestSurvey0/</a>           </td><td align="right">2019-07-26 11:51  </td><td align="right">  - </td><td>&nbsp;</td></tr>
<tr><td valign="top">&nbsp;</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>&nbsp;</td></tr>
<tr><td valign="top">&nbsp;</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>&nbsp;</td></tr>
<tr><td valign="top">&nbsp;</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>&nbsp;</td></tr>
<tr><td valign="top">&nbsp;</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>&nbsp;</td></tr>
<tr><td valign="top">&nbsp;</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>&nbsp;</td></tr>
<tr><td valign="top">&nbsp;</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>&nbsp;</td></tr>
<tr><td valign="top">&nbsp;</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>&nbsp;</td></tr>
<tr><td valign="top">&nbsp;</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>&nbsp;</td></tr>
<tr><td valign="top">&nbsp;</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>&nbsp;</td></tr>
<tr><td valign="top">&nbsp;</td><td><a href="vendor/">vendor/</a>                </td><td align="right">2019-07-15 07:59  </td><td align="right">  - </td><td>&nbsp;</td></tr>
<tr><td valign="top">&nbsp;</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>&nbsp;</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)?

如果我对 PUT 请求使用以 /SurveyStuff/testSurveyFile.json 结尾的 uri,我会收到 405(不允许)响应。我意识到这是我从一开始就应该做的事情,尽管我在来这里之前确实尝试过。此响应是从 Postman 和我的应用程序返回的。bluehost 是否出于安全目的阻止了请求?我尝试了各种 FTP 和站点凭据,但它们没有任何区别。

诺亚

我第二次与 bluehost 支持人员进行了交谈,这一次他们说 bluehost 不支持来自任何外部来源(包括 Postman)的 HTTP POST 请求。看来我需要找到另一个地方来托管这个文件。我为我在这一点上的困惑道歉。我感谢这些帮助,因为它提高了我对 HTTP 请求和 Web 编程的总体理解。非常感谢你。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章