【发布时间】:2019-10-09 14:36:22
【问题描述】:
我会直截了当:如何将 PDF 文件从 C# 后端上传到 multipart/form-data 请求中的 HTTP Web 服务,而不会使内容被破坏到文件变得不可读的程度? Web 服务文档仅声明文本文件应为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 kB 以上)。 UTF-7 和 ANSI 的结果相同,但 UTF-8 的结果与原始文件的内容最接近。 - 使用
BinaryWriter或Stream.Write将文件作为二进制数据写入请求正文会导致Web 服务将其作为无效的POST 数据直接拒绝。Content-Transfer-Encoding: binary(由文档指出对于application/http是必要的,因此我尝试了)也会导致拒绝。
有哪些替代选项可用?如何在没有 .NET 的情况下用占位符字符静默替换无效字节的情况下对 PDF 进行编码?请注意,我无法控制 Web 服务接受什么样的内容;如果我这样做了,我已经转移到 base64 了。
【问题讨论】:
-
您尝试过将
HttpClient与MultipartFormDataContent一起使用吗? -
@DavidTansey Stream.CopyTo() 也不起作用,Web 服务将其作为无效的 POST 数据拒绝。
标签: c# http pdf encoding multipartform-data