【问题标题】:In JAVA How to send byte[] data to downloadable file?在 JAVA 中如何将字节 [] 数据发送到可下载文件?
【发布时间】:2013-12-06 21:20:21
【问题描述】:

我正在使用 JAVA HttpServlets 在 Eclipse 中开发一个动态工作项目。

我有一些 byte[] 格式的数据,我通过一些 API 调用获得这些数据。我可以将其存储在一个新文件中,但我想要的是它应该可供用户以不同格式下载,例如 csv、xls、pdf。

我提到了一些链接。我正在使用 saveReportToLocalMachine 方法来保存它 这工作正常。 但是,如果我对相同的 byte[] 数据使用 displayReportToUser,它会创建一个可下载的文件,但该文件显示损坏的错误。

public static void saveReportToLocalMachine(byte[] data, String fileLocation,
        String filename) throws IOException {

    File file = new File(fileLocation, filename);
    FileOutputStream fstream = new FileOutputStream(file);
    fstream.write(data);
    fstream.close();
}

下面是使文件可下载的方法。

private void displayReportToUser(byte[] byteData, String outputType,  
 HttpServletResponse resp) throws IOException {
    resp.setContentType("application/pdf");
    resp.setHeader("Content-Disposition","attachment;filename=temp.pdf");

    ServletOutputStream out = resp.getOutputStream();

    out.write(byteData);
    out.flush();
    out.close();

}

但这对我不起作用。 有人可以指导和解释吗? 错误请指出

【问题讨论】:

  • 你应该发布你的答案或至少接受下面的答案...

标签: java servlets bytearray outputstream


【解决方案1】:
while(in.read(outputByte, 0, 4096) != -1)
{
    out.write(outputByte, 0, 4096);
}

你忽略了计数。 Java中正确的复制循环如下:

int count;
while((count = in.read(outputByte)) > 0)
{
    out.write(outputByte, 0, count);
}

您不需要在关闭之前刷新out

但是由于您拥有byte[], 的数据,您只需要调用out.write(data). 就不需要ByteArrayInputStream, 或循环。

【讨论】:

  • 我试过了,但没有用。它会下载文件,但显示它已损坏。但是如果我在一个新文件中输出 byte[] 数据,它工作正常,所以问题不在于数据。
  • 可能你没有准确复制代码。另见我的编辑。我什至不知道ByteArrayInputStream 在那里做什么。你不需要它。
  • 感谢您及时回复,能否指出我的代码中的错误?我改进了我的问题
  • 如何解决?请在此处发布您的解决方案,以示对过去和未来读者的礼貌。
猜你喜欢
  • 1970-01-01
  • 2020-11-17
  • 2020-06-02
  • 1970-01-01
  • 2012-01-15
  • 2016-01-12
  • 1970-01-01
  • 1970-01-01
  • 2018-04-25
相关资源
最近更新 更多