0

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

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

请帮忙。

谢谢。

4

1 回答 1

0

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

问题的原因更有可能是您创建/保存文件的方式。当您使用 aReader和/或未Writer指示对正在读/写的字符使用正确的字符编码时,此问题将显现出来。也许您正在创建上传/下载服务,而问题出在上传过程本身?

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

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

和作者如下:

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

但是,如果您实际上不需要在每个字符的基础上操作流,而只是想传输未修改的数据,那么您实际上应该一直使用InputStream/ OutputStream

也可以看看:

于 2012-12-20T12:23:20.827 回答