【问题标题】:PDF upload encoding issuePDF上传编码问题
【发布时间】: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.WriteLineFile.ReadAllTextEncoding.UTF8.GetString(File.ReadAllBytes) 将文件写入请求正文会导致上传的文件不可读,因为.NET 已将所有非UTF-8 字节替换为正方形(不知何故也文件大小增加了 100 kB 以上)。 UTF-7 和 ANSI 的结果相同,但 UTF-8 的结果与原始文件的内容最接近。
  • 使用BinaryWriterStream.Write 将文件作为二进制数据写入请求正文会导致Web 服务将其作为无效的POST 数据直接拒绝。 Content-Transfer-Encoding: binary(由文档指出对于 application/http 是必要的,因此我尝试了)也会导致拒绝。

有哪些替代选项可用?如何在没有 .NET 的情况下用占位符字符静默替换无效字节的情况下对 PDF 进行编码?请注意,我无法控制 Web 服务接受什么样的内容;如果我这样做了,我已经转移到 base64 了。

【问题讨论】:

  • 您尝试过将HttpClientMultipartFormDataContent 一起使用吗?
  • @DavidTansey Stream.CopyTo() 也不起作用,Web 服务将其作为无效的 POST 数据拒绝。

标签: c# http pdf encoding multipartform-data


【解决方案1】:

问题解决了,我的错。多部分表单标题和二进制数据都是正确的,但顺序错误,因为在使用Stream.CopyTo() 将二进制数据写入请求流之前,我没有Flush()StreamWriter

故事的寓意:如果您同时与多个作家写到同一个Stream在与下一个作家做任何事情之前总是Flush()。 p>

【讨论】:

    猜你喜欢
    • 2020-01-25
    • 1970-01-01
    • 2011-08-04
    • 2012-06-04
    • 2015-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多