3

Я пытаюсь загрузить файл и сохранить его на сервере. Но я получаю:java.lang.IllegalStateException: Файл уже перемещен - нельзя передать повторно

java.lang.IllegalStateException: File has already been moved - cannot be transferred again 

Я использую Commons FileUpload jar (CommonsMultipartFile). Я получаю IllegalStateException для справки: user.getFileData().transferTo(new File("/home/xavier/uploads/" + user.getFileData().getOriginalFilename()));

Здесь user is bean. Сначала он работал для меня, но когда я снова тестировал, удалив файлы из папки uploads, он сделал исключение, как указано выше.

StackTrace:

java.lang.IllegalStateException: File has already been moved - cannot be transferred again 
    at org.springframework.web.multipart.commons.CommonsMultipartFile.transferTo(CommonsMultipartFile.java:126) 
    at com.raistudies.controllers.RegistrationController.processForm(RegistrationController.java:113) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:213) 
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:126) 
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578) 
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882) 
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:754) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) 
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1523) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188) 
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641) 
    at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97) 
    at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185) 
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:325) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:226) 
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:165) 
    at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791) 
    at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693) 
    at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954) 
    at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170) 
    at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135) 
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102) 
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88) 
    at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76) 
    at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53) 
    at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57) 
    at com.sun.grizzly.ContextTask.run(ContextTask.java:69) 
    at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330) 
    at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309) 
    at java.lang.Thread.run(Thread.java:722) 
+0

Можете ли вы опубликовать stacktrace? – NINCOMPOOP

+1

Это вызвано либо 1) вызовом multipartFile.transferTo (destFile) более одного раза, либо 2) вызовом transferTo за пределами жизненного цикла запроса. – NINCOMPOOP

+0

Я решил свою проблему. Вот ссылка http: // stackoverflow.com/questions/3747430/problem-with-spring-fileupload –

ответ

1

кажется, что файл не доступен в качестве временного файла (например).

Просто, взглянув на коде transferTo() метода и вызов isAvailable метода, который бросает свое исключение:

http://grepcode.com/file/repo1.maven.org/maven2/org.springframework/spring-web/3.2.1.RELEASE/org/springframework/web/multipart/commons/CommonsMultipartFile.java#CommonsMultipartFile.isAvailable%28%29

В других случаях это исключение не будет выброшено.

3

Исключение, которое вы указали в своем вопросе, гласит: «Файл был перемещен - невозможно прочитать снова». Это связано с тем, что мы пытаемся читать входной поток более одного раза из многостраничного файла.

Я также столкнулся с этой проблемой за один раз, и в моем случае сначала я проверил содержимое файла, а затем попытался сохранить его с помощью метода «transferTo» в Spring MultiPart. Это исключение возникает, когда я пытаюсь использовать метод «transferTo». Здесь я дважды вызываю входной поток.

Я не сталкиваюсь с этой проблемой, когда размер файла слишком мал. В методе «transferTo» есть внутренний вызов метода «isAvailable». Пожалуйста, следуйте сегмент кода ниже:

protected boolean More ...isAvailable() { 
     // If in memory, it's available. 
    if (this.fileItem.isInMemory()) { 
     return true; 
    } 
    // Check actual existence of temporary file. 
    if (this.fileItem instanceof DiskFileItem) { 
     return ((DiskFileItem) this.fileItem).getStoreLocation().exists(); 
    } 
    // Check whether current file size is different than original one. 
    return (this.fileItem.getSize() == this.size); 
} 

ссылка: http://grepcode.com/file/repo1.maven.org/maven2/org.springframework/spring-web/3.2.1.RELEASE/org/springframework/web/multipart/commons/CommonsMultipartFile.java#CommonsMultipartFile.isAvailable%28%29

Наблюдения:

Если он слишком мал, весна сохранить его в памяти, и когда мы задаем для файла он retrive из памяти. Мы можем запросить его несколько раз, потому что файл находится в памяти.

Если он достаточно велик, Spring сохранит его как временный файл, который мы не знаем о местоположении, но после того, как мы прочитаем входной поток после того, как этот файл может быть удален внутренне к весне. Затем, когда мы просим второй раз, что ошибка говорит, что «невозможно прочитать снова».

Таким образом, мое решение заключается в том, что сначала я должен сохранить его в сервере loaction с помощью метода «transferTo» и получить этот локальный файл для проверки или любой другой второй необходимости.

Я думаю, что это не очень полезно для увеличения «maxUploadSize» в компоненте «multipartResolver», поскольку он потребляет больше памяти, если файл слишком велик.

+0

Возможно, вы захотите изменить форматирование; его трудно прочитать, если вы форматируете некод в качестве кода. Последняя часть также отрезана; было что-то еще, что вы пытались сказать? –

+0

Я отформатировал свой ответ. Пожалуйста, ответьте на любые вопросы. – Arosha

Смежные вопросы