图像无法写入spring的资源文件夹中

时间:2014-05-28 15:05:10

标签: java spring filestream

这是我的服务方法

public void CapchaString() {
                 String capchaString = UUID.randomUUID().toString();
    //         ByteArrayInputStream bais = new ByteArrayInputStream(capchaString.getBytes());
                            try {
                               BufferedImage bi=new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB);
                               Graphics g = bi.getGraphics();
                               g.drawString(capchaString, 10, 10);
                              /* File outputfile = new File("src/main/resources/output.png");*/
                               ImageOutputStream out = new FileImageOutputStream(new File("C:/Users/Saurabh/Documents/Agile maple code/JavaJ2eeTraining/src/main/resources/output.png")); 
                               ImageIO.write(bi, "png", out);

                           } catch (IOException e) {
                               throw new RuntimeException(e);
                           }


            }
    }

这是我的控制器方法

@ResponseBody
@RequestMapping(value="/photo2", method = RequestMethod.GET, produces = MediaType.IMAGE_JPEG_VALUE)
public byte[] testphoto() throws IOException {
    capchaService.CapchaString();
    Resource resource = loader.getResource("output.png");

           ImageIO.createImageInputStream(resource.getFile());
    InputStream is = new BufferedInputStream(new FileInputStream(resource.getFile()));
    return IOUtils.toByteArray(is);
}

当我使用我的服务器时,我得到了 HTTP状态500 - 类路径资源[output.png]无法解析为URL,因为它不存在

org.springframework.core.io.ClassPathResource.getURL(ClassPathResource.java:177)     org.springframework.core.io.AbstractFileResolvingResource.getFile(AbstractFileResolvingResource.java:48)     com.agilemaple.common.controller.HelloController.testphoto(HelloController.java:174)     sun.reflect.NativeMethodAccessorImpl.invoke0(原生方法)     sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)     sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)     java.lang.reflect.Method.invoke(Method.java:606)     org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215)     org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)     org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)     org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745)     org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686)     org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)     org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)     org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)     org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:953)     org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:844)     javax.servlet.http.HttpServlet.service(HttpServlet.java:621)     org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:829)     javax.servlet.http.HttpServlet.service(HttpServlet.java:728)     org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)

1 个答案:

答案 0 :(得分:0)

您真的需要了解网络应用的工作原理:

  1. 您设置了开发环境并创建了源代码。 src/main/resources是此开发环境的一部分。
  2. 您编译源并将它们组装成war文件或爆炸的war目录
  3. 将war文件部署到服务器,该服务器从war文件加载类和资源。不是来自您的开发环境。
  4. 在生产中,您所拥有的只是部署war文件的服务器。服务器上没有开发环境。生产服务器可能是一个Linux服务器,其中C:/Users/Saurabh/之类的路径甚至没有意义。即使它是一台Windows机器,该目录也不存在。即使它存在,webapp也不会从那里加载资源,而是从已部署的war文件加载资源。

    所以上面的代码没有任何意义。如果在服务中生成图像,则从方法返回图像的字节,而不是尝试将其写入文件,然后从文件中重新加载字节。