下载文件Servlet -文件内容包含二进制文件



我曾尝试开发一个允许用户下载文件的servlet,但它允许用户下载文件,但文件内容包含二进制垃圾,而不是人类可读的。我可以知道是什么原因吗?

代码
int length = -1, index = 0;
        byte[] buffer = null;
        String attachmentPath = null, contentType = null, extension = null; 
        File attachmentFile = null;
        BufferedInputStream input = null;
        ServletOutputStream output = null;
        ServletContext context = null;
        attachmentPath = request.getParameter("attachmentPath");
        if (attachmentPath != null && !attachmentPath.isEmpty()) {
            attachmentFile = new File(attachmentPath);
            if (attachmentFile.exists()) {
                response.reset();
                context = super.getContext();  
                contentType = context.getMimeType(attachmentFile.getName());       
                response.setContentType(contentType);
                response.addHeader("content-length", String.valueOf(attachmentFile.length()));  
                response.addHeader("content-disposition", "attachment;filename=" + attachmentFile.getName());
                try {
                    buffer = new byte[AttachmentTask.DEFAULT_BUFFER_SIZE];
                    input = new BufferedInputStream(new FileInputStream(attachmentFile));
                    output = response.getOutputStream();
                    while ((length = input.read(buffer)) != -1) {
                        output.write(buffer, 0, length);
                        index += length;
//                      output.write(length);
                    }
                    output.flush();
                    input.close();
                    output.close();
                } catch (FileNotFoundException exp) {
                    logger.error(exp.getMessage());
                } catch (IOException exp) {
                    logger.error(exp.getMessage());
                }

            } else {
                try {
                    response.sendError(HttpServletResponse.SC_NOT_FOUND);
                } catch (IOException exp) {
                    logger.error(exp.getMessage());
                }
            }

它与二进制或文本模式或浏览器设置写入文件有关?

请帮助。

谢谢。

问题不在目前给出的代码中。您正确地使用InputStream/OutputStream而不是Reader/Writer来流式传输文件。

问题的原因更可能在于您创建/保存文件的方式。当您使用Reader和/或Writer时,没有指示为正在读/写的字符使用适当的字符编码,则会出现此问题。也许你正在创建一个上传/下载服务,而错误是在上传过程本身?

假设数据是UTF-8格式,您应该按照如下方式创建阅读器:

Reader reader = new InputStreamReader(new FileInputStream(file), "UTF-8"));

和写作者如下:

Writer writer = new OutputStreamWriter(new FileOutputStream(file), "UTF-8"));

但是如果你实际上不需要对每个字符的流进行操作,而只是想不加修改地传输数据,那么你实际上应该一直使用InputStream/OutputStream

参见:

  • Unicode -如何得到正确的字符?

相关内容

  • 没有找到相关文章

最新更新