【问题标题】:writing byte[] to file giving corrupt file将字节 [] 写入给损坏文件的文件
【发布时间】:2016-06-23 12:18:44
【问题描述】:

我在 servlet 的请求参数中获取 byte[],我在字符串中获取该参数,然后再次将其转换为 byte[]:

String encodingScheme = "UTF-8";
request.setCharacterEncoding(encodingScheme);
String requestStr = request.getParameter("inputstream");
byte[] rawRequestMsg = requestStr.getBytes(encodingScheme);

现在这个 byte[] 我正在尝试写入 .docx 文件,因为我正在使用的这个 byte[] 只是 docx 文件的 byte[] 表示。将其写入文件的代码如下:

String uploadedFileLocation = fileLocation;
FileOutputStream fileOuputStream = new FileOutputStream("path till .docx file");
fileOuputStream.write(byteArray);
fileOuputStream.close();

问题是正在创建的 .docx 文件已损坏且无法打开,但是当我将其更改为 .doc 时,我可以打开它,但我看不到文本内容,而只看到 byte[] 序列,如下所示:

80, 75, 3, 4, 20, 0, 6, 0, 8, 0, 0, 0, 33, 0, -84, -122, 80, 87, -114, 1, 0, 0, -64, 5, 0, 0, 19, 0, 8, 2, 91, 67, 111, 110, 116, 101, 110, 116, 95, 84, 121, 112, 101, 115, 93, 46, 120, 109, 108, 32, -94, 4, 2, 40, -96, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 

不知道如何正确写。 需要帮忙。 谢谢, 萨米尔

实际上下面的代码曾经是一个 REST web 服务的工作

@
POST@ Path("/binaryfileupload/{filename}")@ Consumes(MediaType.APPLICATION_OCTET_STREAM)
public Response upload(byte[] input, @PathParam("filename") String filename) {
  FileOutputStream fileOuputStream = new FileOutputStream(uploadedFileLocation);
  fileOuputStream.write(input);
  fileOuputStream.close();
}

我所做的唯一更改是从这里输入字节 [] 我发送到 servlet 并且在 servlet 中想要写入文件而不是写入我的 web 服务(它工作正常)。

【问题讨论】:

  • 文件可能是 DOC 格式而不是 DOCX 格式。它们非常不同。
  • 查看此链接:stackoverflow.com/questions/25890776/java-bytearray-to-docx。也许那里的解决方案可以将带有 byte[] 的 DOC 正确地转换为 DOCX。
  • 看前几个字节,这似乎不是 DOCX 或 DOC 格式garykessler.net/library/file_sigs.html
  • 您似乎将输入流解释为 UTF-8 ......但这实际上是您输入的编码格式吗?例如,您是否有可能接收到 GZIP 编码的字节流作为实际输入?
  • 我已经用更多信息编辑了帖子,排除了不正确的文档格式 UTF-8 GZIP 编码等的可能性。

标签: java file file-io bytearray file-writing


【解决方案1】:

您不是在编写 .doc 文件。您只是在编写一个简单的文本文件并将其命名为 .doc 或 .docx。

要使其作为 Word 文档文件工作,您需要使用 Apache POI 等库来为您完成。

有关 Apache POI 的更多信息,您可以在此处查看:https://poi.apache.org/

你也可以参考这个链接How can I create a simple docx file with Apache POI?

【讨论】:

  • 我认为问题在于编码格式。我认为对于 .doc 和 .docx 文件,UTF-8 不是正确的编码格式。请参阅此线程以获取更多详细信息:stackoverflow.com/questions/28172022/…
  • 我认为它与编码无关。因为在我的 webservice 方法中,如果我编写相同的 byte[] 序列,它的编写没有任何问题。但是如果我将字节 [] 序列发布到 servlet 并使用我编写的相同代码写入文件,则它无法按预期工作。
  • 但在 Web 服务方法中,您没有设置任何字符编码。但是在 servlet 中,您将编码显式设置为 UTF-8。编码的主要区别在于您的字符串到字节的转换。
  • 关于输入是什么的证据为零。
  • @EJP 这里的输入是一个简单的 docx 文件,我将它作为二进制形式的 POSTMaster 工具发布到我的网络服务,并在我的网络服务的 byte[] 参数中获取它,现在如果我写那个 byte[]在那里自己归档,它正在工作。但是,我想使用 POST 请求将该字节 [] 发送到我的 servlet,并在我的 servlet 中执行写入操作。将 byte[] 写入文件代码与我在 web 服务中使用的 servlet 完全相同。 byte[] 数据也是一样的。如果需要更多信息,请告诉我。
【解决方案2】:

我终于修好了。我犯了一个小错误。在代码中

String requestStr = request.getParameter("inputstream");
byte[] rawRequestMsg = requestStr.getBytes(encodingScheme);

我实际上正在将字符串转换为字节,即使它已经在字节中。这就是为什么 requestStr 的值与 rawRequestMsg 不同的原因。最后,我使用了下面的代码,它只是将字符串放入数组中,并通过单独分隔每个数字来从中创建 byte[]:

String requestStr = request.getParameter("inputstream");
requestStr = requestStr.substring(1, requestStr.length() - 1);
String dataArray[] = requestStr.split(",");
byte[] rawRequestMsg = new byte[dataArray.length];
int count = 0;
for (String str: dataArray) {
  str = str.trim();
  rawRequestMsg[count++] = Byte.parseByte(str);
}

trim 函数用于删除空格,因为它以 75、-84、3 .... 的形式出现。子字符串用于删除开头的 [ 和结尾的 ]。 谢谢大家帮助我。 希望这对某人有所帮助。

【讨论】:

    猜你喜欢
    • 2021-09-12
    • 1970-01-01
    • 1970-01-01
    • 2019-01-09
    • 1970-01-01
    • 2014-07-24
    • 1970-01-01
    • 2019-06-03
    相关资源
    最近更新 更多