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

时间:2012-12-20 10:04:58

标签: servlets download

我曾尝试开发一个允许用户下载文件的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());
                }
            }

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

请帮忙。

感谢。

1 个答案:

答案 0 :(得分:0)

问题不在于目前为止给出的代码中。您正在使用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所有时间。

另见: