Servlets 不能';t打开从httpservletrequest下载的图像并保存在本地光盘中

Servlets 不能';t打开从httpservletrequest下载的图像并保存在本地光盘中,servlets,Servlets,这是我用来下载图片并保存的代码。有人能建议我还需要做什么或者我在这里错过了什么吗??提前谢谢 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { BufferedWriter writer = null; InputStream in = new BufferedInputStream(re

这是我用来下载图片并保存的代码。有人能建议我还需要做什么或者我在这里错过了什么吗??提前谢谢

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    BufferedWriter writer = null;
    InputStream in = new BufferedInputStream(request.getInputStream());
            try {                       
        byte[] buffer = new byte[100000];
        int n = -1;
        while ((n = in.read(buffer)) >= 0) {
            out.write(buffer, 0, n); // used for image
        }
        out.close();
        byte[] res = out.toByteArray();
        out.flush();
        FileOutputStream fos = new FileOutputStream("D://"+ new SimpleDateFormat("yyyyMMdd_HHmmssss").format(Calendar.getInstance().getTime()) +".jpg");
        fos.write(res);
        fos.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

可能是因为您没有设置响应标题和内容类型。请尝试此操作

 protected void doGet( HttpServletRequest request,HttpServletResponse response)
    {
        try {
            Path path = Paths.get("c:\\test.jpg");
            response.setHeader("Content-Length", ""+Files.size(path));
            response.setContentType("image/jpeg");
            response.setHeader("Content-Disposition", "attachment; filename=\""+path.getFileName()+"\";");
            ServletOutputStream outputStream;
            outputStream = response.getOutputStream();
            byte[] data = Files.readAllBytes(path);
            outputStream.write(data);
        } catch (IOException ex) {ex.printStackTrace();}
    }

我找到了一个基于多部分/表单数据的解决方案,因为服务器应该能够处理多部分/表单数据。为此我必须

private static final MultipartConfigElement MULTI_PART_CONFIG = new MultipartConfigElement(
        System.getProperty("java.io.tmpdir"));
在处理器内部

内部句柄方法 然后我们可以从请求中获取文件,如下所示

@Override
public void handle(String target, Request baseRequest,
        HttpServletRequest request, HttpServletResponse response)
        throws IOException, ServletException {
    if (request.getContentType() != null
            && request.getContentType().startsWith("multipart/form-data")) {
        baseRequest.setAttribute(Request.__MULTIPART_CONFIG_ELEMENT,
                MULTI_PART_CONFIG);
    }
    // response.setContentType("text/html;charset=utf-8");
    response.setStatus(HttpServletResponse.SC_OK);
    baseRequest.setHandled(true);


        final FileOutputStream output = new FileOutputStream("D:\\Dir\\"+ request.getParameter("imageName") + ".jpg");
        IOUtils.copy(request.getPart("file").getInputStream(), output);
        output.close();


}

这里的IOUtils来自apache commons io jar文件

@Manish我不想在程序中打开,只是在文件系统中打开保存的文件,但是photo viewer无法打开图片。如果您想从servlet下载文件,您必须将字节[]作为servlet响应写入。检查此项并
@Override
public void handle(String target, Request baseRequest,
        HttpServletRequest request, HttpServletResponse response)
        throws IOException, ServletException {
    if (request.getContentType() != null
            && request.getContentType().startsWith("multipart/form-data")) {
        baseRequest.setAttribute(Request.__MULTIPART_CONFIG_ELEMENT,
                MULTI_PART_CONFIG);
    }
    // response.setContentType("text/html;charset=utf-8");
    response.setStatus(HttpServletResponse.SC_OK);
    baseRequest.setHandled(true);


        final FileOutputStream output = new FileOutputStream("D:\\Dir\\"+ request.getParameter("imageName") + ".jpg");
        IOUtils.copy(request.getPart("file").getInputStream(), output);
        output.close();


}