2015-10-28 11 views
5

Próbuję strumieniowo plik wideo nad resztą, Próbuję zaimplementować coś podobnego do Jersey takiego:Stream plik wideo na http z REST Spark 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; 
    } 

Oto co mam do przesyłania plików i pobierania strumieniowego (pobierz/naczep prac, rozmiar pliku jest poprawna przez uszkodzony):

naprawdę trzeba pomóc z tym wszystkim, dzięki

UPDATE

zmianie:

ByteArrayOutputStream out = new ByteArrayOutputStream(); 

do:

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

UPDATE 2 Ok, ale w końcu dostał to działa, a gra wideo w przeglądarce, ale teraz coraz Jetty io.EofException, zamknąłem strumień, ale wciąż musi być czymś prostym.

Poniżej znajdują się zarówno przed, jak i po:

i pobierając plik z działa przeglądarka, ale w jaki sposób można przesyłać bezpośrednio w przeglądarce?

przed (nie działa)

//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; 
     }); 

PO (Działa to doskonale, ale coraz koniec wyjątkiem pliku):

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; 

     }); 

Dodano:

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

przykro być nitpicker ale skulił się, kiedy zobaczyłem sposób sformułowane pytanie. Nie można przesyłać strumieniowo wideo w stylu architektonicznym. – toniedzwiedz

+0

@toniedzwiedz ??? ok, nie wiem, co masz na myśli. W każdym razie, poprawiłem moje rozwiązanie i działa idealnie. Może źle to sformułowałem, ale twój komentarz jest w rzeczywistości bezużyteczny. – franklinexpress

Odpowiedz

5

Oto metoda, która działa. Będę przesłać rozwiązanie, które pozwala ci przejść do sekcji wideo, jak również, bułka z masłem;)

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

Hi @franklinexpress - Przyjrzałem się zagadnieniom Github Sparkjavy i wydaje się, że podejście, które ma strumień nieograniczony (nieznana długość) nie działa? Czy to jest poprawne? Moim konkretnym przypadkiem użycia jest proxy strumieniowego strumienia audio (np. 'Http: //82.77.137.30: 8557 /;') – yegeniy

+1

tak powinno działać. Teraz zaimplementowałem, że przy użyciu Servlet z funkcją wyszukiwania (Accept-Ranges) część seek nie działałaby dla nieznanej długości, ale powinna to być transmisja strumieniowa. – franklinexpress

+0

o słodko. Tak więc, po prostu nie ustawiłbym długości. Dziękuję Ci. – yegeniy

Powiązane problemy