Проблема с кодировкой загрузки PDF - PullRequest
0 голосов
/ 09 октября 2019

Я сразу перейду к делу: как выгрузить 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.

...