Я попытался сохранить файл в базе данных через мой контроллер, где я вызываю метод действия этой реализации, чтобы захватить файл в моем запросе http, затем создать новый экземпляр моего класса Foto и при попытке использовать метод set () выдает ошибку «Поток закрыт», я отлаживаю код и обнаружил, что в реализации метода write () в классе IO есть ошибка, когда OutputStream закрыто.
Мой класс Фото:
@Entity
public class Foto {
public String descripcion;
public String fileName;
public Blob image;
public Integer posicion;
...setter and getter methods
}
Мое действие в контроллере:
public static void uploadFoto(Long id) {
try {
String fileName = request.headers.get("x-file-name").value();
InputStream inputStream = request.body;
String contentType = MimeTypes.getContentType(fileName);
Foto foto = new Foto();
foto.setFileName(fileName);
foto.setImage(new Blob());
foto.getImage().set(inputStream, contentType);
foto.save();
renderJSON("{success: true}");
} catch (Exception ex) {
ex.printStackTrace();
enderJSON("{success: false}");
}
}
Метод set () int Класс BLOB-объекта:
public class Blob implements BinaryField, UserType {
@Override
public void set(InputStream is, String type) {
this.UUID = Codec.UUID();
this.type = type;
IO.write(is, getFile());
}
.... others methods
}
Метод write () в классе ввода-вывода:
public class IO {
public static void write(InputStream is, File f) {
try {
OutputStream os = new FileOutputStream(f);
try {
IOUtils.copyLarge(is, os);
} finally {
//**In this line throws exception**
closeQuietly(is);
closeQuietly(os);
}
} catch (IOException e) {
throw new UnexpectedException(e);
}
}
...others methods
}
Журнал:
java.io.IOException: Stream Closed
at java.io.FileInputStream.read0(Native Method)
at java.io.FileInputStream.read(FileInputStream.java:207)
at controllers.GaleriaController.agregarFotoUploader(GaleriaController.java:273)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at play.mvc.ActionInvoker.invokeWithContinuation(ActionInvoker.java:546)
at play.mvc.ActionInvoker.invoke(ActionInvoker.java:483)
at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:477)
at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:444)
at play.mvc.ActionInvoker.invoke(ActionInvoker.java:167)
at play.server.PlayHandler$NettyInvocation.execute(PlayHandler.java:292)
at play.Invoker$Invocation$1.apply(Invoker.java:319)
at play.Invoker$Invocation$1.apply(Invoker.java:315)
at play.db.jpa.JPA.withTransaction(JPA.java:285)
at play.db.jpa.JPA.withinFilter(JPA.java:238)
at play.db.jpa.JPAPlugin$TransactionalFilter.withinFilter(JPAPlugin.java:306)
at play.Invoker$Invocation.withinFilter(Invoker.java:298)
at play.Invoker$Invocation.run(Invoker.java:315)
at play.server.PlayHandler$NettyInvocation.run(PlayHandler.java:269)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Как решить «IOException: Поток закрыт» Ошибка?