Когда я использую метод .set () класса Blob в Play Framework v1.5, он выдает ошибку - PullRequest
0 голосов
/ 30 апреля 2020

Я попытался сохранить файл в базе данных через мой контроллер, где я вызываю метод действия этой реализации, чтобы захватить файл в моем запросе 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: Поток закрыт» Ошибка?

...