【问题标题】:Couldn't open the image wish is downloaded from httpservletrequest and save in the local disc无法打开图像希望从 httpservletrequest 下载并保存在本地磁盘中
【发布时间】:2013-07-25 06:39:27
【问题描述】:

这是我用来下载图像并保存的代码。任何人都可以建议我还需要做什么或我在这里错过了什么吗?提前谢谢

    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();
    }
}

【问题讨论】:

  • @Manish 我不想在程序中打开,只是打开文件系统中保存的文件,但是照片查看器无法打开图片
  • 如果您愿意以某种方式从 servlet 下载文件,则必须将 byte[] 作为 servlet 响应。

标签: servlets


【解决方案1】:

可能是因为你没有设置响应头和内容类型。试试这个

 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();}
    }

【讨论】:

    【解决方案2】:

    我为我的问题找到了基于 Multipart/form-data 的替代解决方案,因为服务器应该能够处理 mulipart/form-data。为此我必须拥有

    private static final MultipartConfigElement MULTI_PART_CONFIG = new MultipartConfigElement(
            System.getProperty("java.io.tmpdir"));
    

    在处理程序内部

    还有

    if (request.getContentType() != null
                && request.getContentType().startsWith("multipart/form-data")) {
            baseRequest.setAttribute(Request.__MULTIPART_CONFIG_ELEMENT,
                    MULTI_PART_CONFIG);
        }
    

    handle 方法内部 然后我们可以从请求中获取文件如下

    @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();
    
    
    }
    

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

    【讨论】:

      猜你喜欢
      • 2018-10-23
      • 2014-02-18
      • 2019-06-06
      • 1970-01-01
      • 2022-06-27
      • 2021-07-13
      • 1970-01-01
      • 1970-01-01
      • 2019-06-14
      相关资源
      最近更新 更多