使用多部分/表单数据在服务器中上传文件-C#

时间:2020-04-22 08:36:16

标签: c# httpwebrequest multipartform-data ptc-windchill

我想在WindChill(是PTC的PLM)中上传文件。他们向我们提供了REST API以及提供服务的服务。他们将文件上传分为三个阶段。

  • 第1阶段-我们称为服务,其中提供要上传的文件数。在这种情况下,只有一个。
  • 第2阶段-我们提供文件上传的多部分/表单数据。
  • 第3阶段-我们提供文件名,文件大小等的最后一个阶段...

我认为我的问题在第二阶段。 所有阶段均成功运行,但是当我尝试打开上载的文件(在这种情况下为pdf)时,该文件为空白,但页面数与原始页面相同。我将上传文件的内容与原始文件进行了比较,里面的内容相同,但有很大的不同。原始文件使用ANSI编码,而上载文件使用UTF-8编码。因此,我认为我的问题出在第二阶段。

在这个阶段,我有些怀疑。在C#中,我得到了文件的bytes [],但是最后我需要将此字节传递给字符串以多部分形式发送。我应该使用什么编码来获取字符串?我测试了默认值,UTF-8,UNICODE和ASCII编码,但没有进行任何测试。 这是Post请求正文的示例。在C#中,我使用HTTPWebRequest发出请求。

------boundary
Content-Disposition: form-data; name="Master_URL"

https://MyUrl/Windchill/servlet/WindchillGW
------boundary
Content-Disposition: form-data; name="CacheDescriptor_array"

844032:844032:844032;
------boundary
Content-Disposition: form-data; name="844032"; filename="newDoc.pdf"
Content-Type: application/pdf

%PDF-1.7  //// The content of the file starts here
%µµµµ
1 0 obj
........

------boundary--

在使用这种方法之前,我尝试将bytes []转换为ToBase64String并发送如下内容:

------boundary
Content-Disposition: form-data; name="Master_URL"

https://MyUrl/Windchill/servlet/WindchillGW
------boundary
Content-Disposition: form-data; name="CacheDescriptor_array"

844033:844033:844033;
------boundary
Content-Disposition: form-data; name="844033"; filename="newDoc.pdf"
Content-Type: application/pdf
Content-Transfer-Encoding: base64

JVBERi0xLjcNCiW1tbW1DQox ........ //// The content of the file starts here 
------boundary--

在这种情况下,当我尝试打开文件时,出现错误“无法加载PDF文档”。该文件已损坏。

我认为问题出在第二阶段,但我将分享上一阶段发送给我的内容,以供您理解。

{"ContentInfo":[{"StreamId":844034,"EncodedInfo": "844034%3A40384%3A9276564%3A844034","FileName": "newDoc.pdf","PrimaryContent": true,"MimeType" : "application/pdf","FileSize" : 40384}]}

StreamId和EncodedInfo是我需要在阶段3中提供的阶段2的返回。

任何人都可以看到我在做什么错吗?任何人都有一些提示可以帮助我解决此问题?

非常感谢。

1 个答案:

答案 0 :(得分:0)

我有一个解决此类问题的重要提示。 使用邮递员。做好邮递员的所有工作。工作完成后,您可以使用邮递员生成多种语言的代码。非常感谢。

Postman

Postman