Загрузить файл на сервер с multipart / form-data - C# - PullRequest
0 голосов
/ 22 апреля 2020

Я хочу загрузить файл в WindChill (это PLM от PT C). Они предоставляют нам REST API со службами для этого. Они разделяют загрузку файла на 3 этапа.

  • Этап 1 - Мы вызываем службу, в которой мы указываем количество файлов для загрузки. В этом случае только один.
  • Этап 2 - Составная часть / форм-данные, где мы даем файл для загрузки.
  • Этап 3 - Последний этап, на котором мы даем имя файла, размер файла и т. д. c ...

Я думаю, что моя проблема на этапе 2. Все этапы выполняются успешно, но когда я пытаюсь открыть загруженный файл в данном случае это pdf, файл пустой, но с тем же количеством страниц оригинала. Я сравниваю содержимое загруженного файла с оригинальным, и содержимое внутри одинаковое с большой разницей. Оригинал с кодировкой ANSI, а загруженный - с кодировкой UTF-8. Итак, я думаю, что моя проблема на этапе 2.

У меня есть некоторые сомнения на этом этапе. В C# я получаю байты [] файла, но в конце мне нужно передать эти байты в строку для отправки в многочастной форме. Какую кодировку я должен использовать для получения строки? Я тестировал по умолчанию, кодировку 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--

Перед этим подходом я пытался преобразовать байты [] 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». Файл поврежден.

Я думаю, что проблема на этапе 2, но я поделюсь телом, которое я отправлю на последнем этапе, для вашего понимания.

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

StreamId и EncodedInfo - это результаты этапа 2, которые я должен предоставить на этапе 3.

Кто-нибудь может понять, что я делаю неправильно? У кого-нибудь есть советы, которые помогут мне решить эту проблему?

Большое спасибо.

...