Video-download/stream über Java-servlet
Ich versuche, laden Sie eine video-Datei in meinem server, wenn der client-Zugriffs-URL ähnlich dieser:
http://localhost:8088/openmrs/moduleServlet/patientnarratives/videoDownloadServlet?videoObsId=61
Habe ich versucht diesen code. Aber es funktioniert nicht. Ich Besuche das servlet, das es nur den download einer Leeren (0-Größe) Datei.
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
try {
Integer videoObsId = Integer.parseInt(request.getParameter("videoObsId"));
Obs complexObs = Context.getObsService().getComplexObs(videoObsId, OpenmrsConstants.RAW_VIEW);
ComplexData complexData = complexObs.getComplexData();
Object object2 = complexData.getData(); //<-- an API used in my service. this simply returns an object.
byte[] videoObjectData = SerializationUtils.serialize(object2);
//Get content type by filename.
String contentType = null;
if (contentType == null) {
contentType = "application/octet-stream";
}
//Init servlet response.
response.reset();
response.setBufferSize(DEFAULT_BUFFER_SIZE);
response.setContentType(contentType);
response.setHeader("Content-Length", String.valueOf(videoObjectData.length));
response.setHeader("Content-Disposition", "attachment; filename=\"" + "test.flv" + "\"");
//Prepare streams.
BufferedInputStream input = null;
BufferedOutputStream output = null;
try {
//Open streams.
input = new BufferedInputStream(new ByteArrayInputStream(videoObjectData), DEFAULT_BUFFER_SIZE);
output = new BufferedOutputStream(response.getOutputStream(), DEFAULT_BUFFER_SIZE);
//Write file contents to response.
byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
int length;
while ((length = input.read(buffer)) > 0) {
output.write(buffer, 0, length);
}
} finally {
//Gently close streams.
close(output);
close(input);
}
}
//Add error handling above and remove this try/catch
catch (Exception e) {
log.error("unable to get file", e);
}
}
private static void close(Closeable resource) {
if (resource != null) {
try {
resource.close();
} catch (IOException e) {
//Do your thing with the exception. Print it, log it or mail it.
e.printStackTrace();
}
}
}
Habe ich verwendet BalusC ist fileservlet tutorial aber in meinem Fall habe ich nicht das file-Objekt als inputstream einfach das byte-array-Objekt.
helfen..
Und haben Sie überprüft den Wert von
ja,
videoObjectData
um zu sehen, was in es nach Sie Sie initialisieren?ja,
videoObjectData
enthält die Daten initialisiertInformationsquelleAutor harshadura | 2013-09-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das servlet, die Sie gefunden haben, ist in der Tat insuitable für die Zwecke der streaming einer video-Datei. Es ist mehr intented als eine einfache Datei-download-servlet für statische Dateien wie PDF, XLS, etc.
Einer Menge von video-Player erfordern, dass der server unterstützt sogenannte HTTP-range-Anfragen. I. e. es muss in der Lage sein, um wieder eine bestimmte byte-Bereich von der video-Datei eine Anfrage mit einer
Bereich
header. Zum Beispiel, nur die bytes ab index 1000 bis 2000 auf eine Datei von 10000 bytes lang. Dies ist zwingend notwendig, um der Lage sein zu überspringen, für einen bestimmten Bereich der video-stream schnell genug, ohne die Notwendigkeit, laden Sie die gesamte Datei und/oder zur Verbesserung der Pufferung Geschwindigkeit durch die Erstellung mehrerer HTTP-verbindungen, die jeden fordert einen anderen Teil der video-Datei.Dies ist allerdings eine Menge zusätzlichen code im servlet, das erfordert eine gut Verständnis des HTTP -
Range
Spezifikation. Ein fertig Beispiel finden Sie im Geschmack dieser erweiterte Datei-servlet von dem gleichen Autor der Datei servlet, die Sie gefunden haben. In Ihrem speziellen Fall ist es vielleicht empfehlenswert, speichern Sie die Datei auf der lokalen Festplatte die Datei-system-basierten cache zunächst (z.B. durchFile#createTempFile()
und einige Schlüssel in der HTTP-session), so dass Sie nicht brauchen, um es zu erhalten, die von der externen service wieder und wieder.InformationsquelleAutor BalusC