2015-10-28 15 views
5

मैं बाकी हिस्सों में एक वीडियो फ़ाइल स्ट्रीम करने के लिए कोशिश कर रहा हूँ के साथ बाकी HTTP पर एक वीडियो फ़ाइल, मैं इस तरह जर्सी के लिए कुछ इसी तरह लागू करने के लिए कोशिश कर रहा हूँ फ़ाइल अपलोड और डाउनलोड/स्ट्रीमिंग के लिए (डाउनलोड अर्द्ध काम करता है, फ़ाइल आकार भ्रष्ट द्वारा सही है):स्ट्रीम स्पार्क जावा

मैं वास्तव में इस सभी के साथ मदद की जरूरत है, धन्यवाद

अद्यतन

बदल दिया है:

ByteArrayOutputStream out = new ByteArrayOutputStream(); 

रहे हैं:

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

अद्यतन 2 ठीक है, मैं अंत में यह काम कर रहा है, और ब्राउज़र में वीडियो प्ले, लेकिन अब एक जेट्टी 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

क्षमा करें, लेकिन मैं cringed जब मैं जिस तरह से आप सवाल phrased देखा, मैं एक समाधान है जो आपको साथ ही वीडियो के अनुभागों पर, केक का टुकड़ा अपलोड करने जाएगा। आप एक वास्तुशिल्प शैली पर एक वीडियो स्ट्रीम नहीं कर सकते हैं। – toniedzwiedz

+0

@toniedzwiedz ??? ठीक है, वास्तव में नहीं जानते कि आपका क्या मतलब है। वैसे भी, मैंने अपने समाधान से नरक में सुधार किया और पूरी तरह से काम करता है। शायद मैंने इसे गलत समझा लेकिन आपकी टिप्पणी वास्तव में बेकार है। – franklinexpress

उत्तर

5

यहां दी गई विधि है। nitpicker होने के लिए)

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

हाय @ फ्रैंकलाइनक्सप्रेस - मैंने स्पार्कजावा के जीथब मुद्दों पर एक नज़र डाली, और ऐसा लगता है कि एक दृष्टिकोण जिसमें एक असंबद्ध (अज्ञात लंबाई) धारा काम नहीं करेगी? क्या यह सही है? मेरा विशिष्ट उपयोग केस लाइव ऑडियो स्ट्रीम (जैसे 'http: //82.77.137.30: 8557 /; ') – yegeniy

+1

हां इसे काम करना चाहिए। अब मैंने कार्यान्वित किया है कि एक सर्वलेट का उपयोग करके कार्यक्षमता (स्वीकार्य-रेंज) खोज भाग अज्ञात लंबाई के लिए काम नहीं करेगा लेकिन स्ट्रीमिंग चाहिए। – franklinexpress

+0

ओह मीठा। तो, मैं सिर्फ लंबाई निर्धारित नहीं करता। धन्यवाद। – yegeniy

संबंधित मुद्दे