2015-10-28 2 views
5

Я пытаюсь транслировать видеофайл над остальными, я пытаюсь реализовать что-то подобное в Джерси вроде этого:поток видео файлов через REST HTTP с искрой Java

 ResponseBuilder builder = Response.ok(out.toByteArray()); 
     builder.header("Content-Disposition", "attachment; filename=" + fields.get("filename")); 
     response = builder.build(); 
    } else { 
     response = Response.status(404). 
      entity(" Unable to get file with ID: " + id). 
      type("text/plain"). 
      build(); 
    } 

    return response; 
    } 

Вот что у меня есть для загрузки файлов и загрузки/потокового (скачать полуколониях работ, размер файла правильно поврежденными):

мне действительно нужна помощь с этим всем, благодаря

UPDATE

изменилось:

ByteArrayOutputStream out = new ByteArrayOutputStream(); 

к:

ServletOutputStream out = res.raw().getOutputStream(); 

UPDATE 2 Хорошо, я, наконец, получил это работает, и воспроизведение видео в браузере, но теперь получаю Jetty io.EofException, я закрыл поток, но все же, должен быть чем-то простым.

Ниже приведены как до, так и после того, как:

и загрузки файла из браузера работает, но как я могу это поток прямо в браузере?

ДО (не работает)

//download a video/ trying to stream it right in the browser if possible 
    get("/post/:id", (req, res) -> { 

      res.raw().setContentType("application/octet-stream"); 

      String id = req.params(":id"); 

      ObjectId objectId = new ObjectId(id); 
      BasicDBObject query = new BasicDBObject(); 

      query.put("_id", objectId); 
      //DBObject video = collection.findOne(query); 

      GridFS gridfile = new GridFS(db, "videos"); 
      GridFSDBFile gridFSDBFile = gridfile.findOne(query); 
      res.raw().setHeader("Content-Disposition", "attachment; filename=" + gridFSDBFile.getFilename()); 

      InputStream inputStream = gridFSDBFile.getInputStream(); 

      ServletOutputStream out = res.raw().getOutputStream(); 
      // ByteArrayOutputStream out = new ByteArrayOutputStream(); 
      int data = inputStream.read(); 
      while (data >= 0) { 
       out.write((char) data); 
       data = inputStream.read(); 
      } 
      out.flush(); 
      out.close(); 
      return out; 
     }); 

ПОСЛЕ (Это отлично работает, но получает конец файла исключения):

get("/post/:id", (req, res) -> { 
      //what's the difference between these 2? 
      res.raw().setContentType("video/mp4"); 
      res.type("video/mp4"); 

      String id = req.params(":id"); 

      ObjectId objectId = new ObjectId(id); 
      BasicDBObject query = new BasicDBObject(); 

      query.put("_id", objectId); 
      GridFS gridfile = new GridFS(db, "videos"); 
      GridFSDBFile gridFSDBFile = gridfile.findOne(query); 

      res.raw().setContentLengthLong(gridFSDBFile.getLength()); 
      InputStream inputStream = gridFSDBFile.getInputStream(); 

      ServletOutputStream out = res.raw().getOutputStream(); 

      int data = inputStream.read(); 
      while (data >= 0) { 
       gridFSDBFile.writeTo(out); 
       data = inputStream.read(); 
      } 

      // out.flush(); 
      out.close(); 

      return 200; 

     }); 

Загрузить:

post("/postvideo/:username", (req, res) -> { 
      MultipartConfigElement multipartConfigElement = 
        new MultipartConfigElement("/tmp"); 
      req.raw(). 
        setAttribute("org.eclipse.jetty.multipartConfig", 
          multipartConfigElement); 
      String username = req.params(":username"); 
      double[] location = 
        new double[2]; 
      double lattitude = 
        Double.parseDouble(req.queryParams("lat")); 
      double longitude = 
        Double.parseDouble(req.queryParams("lon")); 
      location[0] = lattitude; 
      location[1] = longitude; 

      InputStream inputStream = req.raw().getPart("file").getInputStream();; 

      Part uploadedFile = req.raw().getPart("file"); 
      // File file = new File(uploadedFile.getName()); 
      GridFS gridFS = new GridFS(db, "videos"); 

      GridFSInputFile gfsFile = gridFS.createFile(inputStream); 

      gfsFile.put("location", location); 
      gfsFile.put("username", username); 
      gfsFile.put("contentType", req.raw().getContentType()); 
      gfsFile.put("filename", uploadedFile.getSubmittedFileName()); 
      collection.insert(gfsFile); 

      gfsFile.save(); 
      return 201; 
     }); 
+0

Извините быть nitpicker, но я насторожилась, когда я видел, как вы Выражаясь вопрос. Вы не можете передавать видео по архитектурному стилю. – toniedzwiedz

+0

@toniedzwiedz ??? хорошо, не знаю, что вы имеете в виду. Во всяком случае, я улучшил ад из своего решения и отлично работает. Возможно, я сформулировал это неправильно, но ваш комментарий на самом деле бесполезен. – franklinexpress

ответ

5

Вот этот метод, который работает. Я буду загружать решение, которое позволит Вам перейти к разделам видео, а также, кусок пирога;)

get("/post/:id", (req, res) -> { 
     //what's the difference between these 2? 
     res.raw().setContentType("video/mp4"); 
     res.type("video/mp4"); 

     String id = req.params(":id"); 

     ObjectId objectId = new ObjectId(id); 
     BasicDBObject query = new BasicDBObject(); 

     query.put("_id", objectId); 
     GridFS gridfile = new GridFS(db, "videos"); 
     GridFSDBFile gridFSDBFile = gridfile.findOne(query); 

     res.raw().setContentLengthLong(gridFSDBFile.getLength()); 
     InputStream inputStream = gridFSDBFile.getInputStream(); 

     ServletOutputStream out = res.raw().getOutputStream(); 

     int data = inputStream.read(); 
     while (data >= 0) { 
      gridFSDBFile.writeTo(out); 
      data = inputStream.read(); 
     } 

     // out.flush(); 
     out.close(); 

     return 200; 

    }); 
+0

Привет @franklinexpress - Я взглянул на проблемы github Спаркьявы, и кажется, что подход, который имеет неограниченный (неизвестный длина) поток, не сработает? Это правильно? Моим конкретным вариантом использования является проксирование живого аудиопотока (например, 'http: //82.77.137.30: 8557 /;') – yegeniy

+1

да, он должен работать. Теперь я реализовал, что с использованием сервлета с функцией поиска (Accept-Ranges) искомая часть не будет работать на неизвестную длину, но потоковая передача должна. – franklinexpress

+0

о сладкий. Итак, я бы просто не установил длину. Спасибо. – yegeniy