Не удается сохранить изображения в пути приложения Spring mvc (java.io.FileNotFoundException) - PullRequest
0 голосов
/ 24 мая 2018

весной mvc. Я хочу сохранить изображения в images folder., Что там внутри resources

Я пытался использовать следующий код

BufferedImage image = null;
        byte[] imageByte;

        BASE64Decoder decoder = new BASE64Decoder();
        imageByte = decoder.decodeBuffer(studentDetails.getStuImg());
        ByteArrayInputStream bis = new ByteArrayInputStream(imageByte);
        image = ImageIO.read(bis);
        bis.close();

        String file=    request.getContextPath()+"/resources/images/imageee.png";

        // write the image to a file
        File outputfile = new File(file);  
        ImageIO.write(image, "png", outputfile);

, но получаю следующее исключение

java.io.FileNotFoundException: \campasAdmin\resources\images\imageee.png (The system cannot find the path specified)
    at java.io.RandomAccessFile.open0(Native Method)
    at java.io.RandomAccessFile.open(Unknown Source)
    at java.io.RandomAccessFile.<init>(Unknown Source)
    at javax.imageio.stream.FileImageOutputStream.<init>(Unknown Source)
    at com.sun.imageio.spi.FileImageOutputStreamSpi.createOutputStreamInstance(Unknown Source)
    at javax.imageio.ImageIO.createImageOutputStream(Unknown Source)
    at javax.imageio.ImageIO.write(Unknown Source)
    at com.rasvek.cms.controller.StudentController.addfeeCategory(StudentController.java:272)
    at com.rasvek.cms.controller.StudentController$$FastClassBySpringCGLIB$$cb2af793.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:738)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
    at org.springframework.aop.framework.adapter.MethodBeforeAdviceInterceptor.invoke(MethodBeforeAdviceInterceptor.java:52)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.aop.framework.adapter.AfterReturningAdviceInterceptor.invoke(AfterReturningAdviceInterceptor.java:52)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:673)
    at com.rasvek.cms.controller.StudentController$$EnhancerBySpringCGLIB$$4b76b9e3.addfeeCategory(<generated>)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:528)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1100)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:687)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1520)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1476)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Unknown Source)

как хранить в следующем месте

please look at derectory

Я хочу в вышеуказанном месте.как это сделать, пожалуйста, помогите мне.спасибо!

Ответы [ 2 ]

0 голосов
/ 26 мая 2018

На вашем месте я бы использовал Spring Content .Тогда вам не нужно беспокоиться о том, как реализовать какой-либо из этого кода, и у вас будет гораздо больше возможностей для хранения ваших изображений.

Добавить в приложение довольно просто.

pom.xml

    <dependency>
        <groupId>com.github.paulcwarren</groupId>
        <artifactId>spring-content-fs</artifactId>
        <version>0.0.11</version>
    </dependency>

StoreConfig.java

@Configuration
@EnableFilesystemStores
public class EnableFilesystemStoresConfig {

    @Bean
    File filesystemRoot() {
        try {
            return new File("/path/to/your/images");
        } catch (IOException ioe) {}
        return null;
    }

    @Bean
    FileSystemResourceLoader fileSystemResourceLoader() {
        return new FileSystemResourceLoader(filesystemRoot().getAbsolutePath());
    }

}

ImageStore.java

  public interface ImageStore extends Store<String> {
  }

Вот и все.ImageStore по сути является Spring ResourceLoader, поэтому все, что вам нужно сделать, это автоматически подключить его, чтобы использовать его.Зависимость spring-content-fs заставит Spring Content внедрить реализацию на основе файловой системы от вашего имени:

ImageStoreTest.java

@RunWith(...)
public class ImageStoreTest {

    @Autowired
    private DocumentStore store;

    @Test
    public void sample() {
       InputStream is = getImageStream();
       Resource r = store.getResource("/some-image.jpg");
       OutputStream os = ((WritableResource)r).getOutputStream();
       IOUtils.copy(is, os);
       is.close();
       os.close();
    }

    public InputStream getImageStream() {
       ...
    }
}

Если вы хотите сохранитьвместо изображений в базе данных или в S3, все, что вам нужно сделать, это изменить зависимость на ту, которая вам нужна, и обновить @Configuration, чтобы добавить сведения о соединении для этого конкретного типа хранилища.Справочные руководства находятся внизу этой страницы .

Поскольку вы используете spring web-mvc, я предполагаю, что у вас есть REST API, так что вы можете пойти еще дальше.Добавьте эту зависимость:

    <dependency>
        <groupId>com.github.paulcwarren</groupId>
        <artifactId>spring-content-rest</artifactId>
        <version>0.0.11</version>
    </dependency>

Эта @Import в ваш StoreConfig.java:

@Configuration
@EnableFilesystemStores
@Import(RestConfiguration.class)
public class EnableFilesystemStoresConfig {

Эта @StoreRestResource аннотация в вашем ImageStore.

ImageStore.java

  @StoreRestResource(path="images")
  public interface ImageStore extends Store<String> {
  }

Теперь у вас будет полнофункциональный (POST, PUT, GET, DELETE) REST-сервис изображений на /images, который будет использовать ваш ImageStore для хранения ваших изображений в/path/to/your/images.

Итак ...

curl --upload-file example-image.jpg /images/example-image.jpg

загрузит example-image.jpg и сохранит его в /path/to/your/images/example-image.jpg на вашем сервере, затем:

GET /images/example-image.jpg

вернется загрузить его.

HTH

0 голосов
/ 25 мая 2018

Всегда старайтесь использовать универсальное решение, потому что путь отличается от ОС к ОС.

используйте разделители Java, чтобы независимо от операционной системы (linux / windows) она работала всегда.

File.separator (import java.io.File;)

ИЛИ в вашем случае, если ОС windows , обратитесь к приведенному ниже коду.

Попробуйте заменить эту строку: String file = request.getContextPath () + "/ resources / images / imageee.png";

С этим: String file = request.getContextPath () + "\\resources\\images\\imageee.png";

Если вы хотите хранить изображения в расположении tomcat (catalina_home), пожалуйста, обратитесь под кодом.

String catalinaRootPath = System.getProperty("catalina.home");
File dir = new File(catalinaRootPath + File.separator + "images");
if (!dir.exists()){
    dir.mkdirs();
}

, а затем запишите изображения внутри него, или вы можете также создать подкаталоги, а затем написать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...