Я сразу перейду к делу: как выгрузить PDF-файлы из бэкэнда C # в веб-службу HTTP внутри запроса multipart/form-data
, чтобы содержимое не было перенаправлено в точку, когда файл стал нечитаемым? В документации веб-сервиса только говорится, что текстовые файлы должны быть text/plain
, а файлы изображений должны быть двоичными;PDF-файлы упоминаются только как «также поддерживаемые», без указания формата и кодировки, в которых они должны быть.
Код, который я использую для создания запроса:
HttpWebRequest request;
string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x");
request.ContentType = "multipart/form-data; boundary=" + boundary;
using (StreamWriter sw = new StreamWriter(request.GetRequestStream())) {
sw.WriteLine("--" + boundary);
sw.WriteLine("Content-Disposition: form-data; name=\"files\"; filename=\"" + Path.GetFileName(filePath) + "\"");
sw.WriteLine(filePath.EndsWith(".pdf") ? "Content-Type: application/pdf" : "Content-Type: text/plain");
sw.WriteLine();
if (filePath.EndsWith(".pdf")) {
// write PDF content into the request stream
}
else sw.WriteLine(File.ReadAllText(filePath));
sw.Write("--" + boundary);
sw.Write("--");
sw.Flush();
}
Для простых текстовых файлов этот код работает просто отлично. Однако при загрузке файла PDF возникают проблемы.
- Запись файла в тело запроса с использованием
StreamWriter.WriteLine
с File.ReadAllText
или Encoding.UTF8.GetString(File.ReadAllBytes)
приводит к тому, что загруженный файл становится нечитаемым из-за .NETзаменив все байты не-UTF-8 на квадраты (что также увеличило размер файла более чем на 100 КБ). Тот же результат с UTF-7 и ANSI, но UTF-8 приводит к наиболее близкому совпадению с содержимым исходного файла. - Запись файла в тело запроса в виде двоичных данных с использованием результатов
BinaryWriter
или Stream.Write
в веб-сервисе, отклоняя его как недействительные данные POST. Content-Transfer-Encoding: binary
(обозначенный в документации как необходимый для application/http
, поэтому я и попытался) также вызывает отклонение.
Какие альтернативные варианты доступны? Как я могу кодировать PDF без .NET без замены неверных байтов на символы-заполнители? Обратите внимание, что я не контролирую, какой контент принимает веб-служба;если бы я это сделал, я бы уже перешел на base64.