[英]Video download/stream using Java servlet
當客戶端訪問URL類似於此時,我試圖在我的服務器中下載視頻文件:
http://localhost:8088/openmrs/moduleServlet/patientnarratives/videoDownloadServlet?videoObsId=61
我試過這段代碼。 但它不起作用。 當我訪問servlet時,它只下載一個空白(0大小)文件。
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();
}
}
}
我使用過BalusC的fileservlet教程,但在我的情況下,我沒有文件對象作為輸入流只是字節數組對象。
救命..
您找到的servlet確實不能用於流式傳輸視頻文件。 它更像是一個簡單的文件下載servlet,用於靜態文件,如PDF,XLS等。
許多視頻播放器要求服務器支持所謂的HTTP范圍請求。 即它必須能夠通過具有Range
標頭的請求返回視頻文件的特定字節范圍。 例如,在10000字節長的文件上只有索引1000到2000的字節。 這是必須的,以便能夠足夠快地跳過特定范圍的視頻流而無需下載整個文件和/或通過創建多個HTTP連接來提高緩沖速度,每個HTTP連接請求視頻文件的不同部分。
然而,這是servlet中的許多附加代碼,需要很好地理解HTTP Range
規范。 您找到的文件servlet的同一作者在此擴展文件servlet的風格中提供了一個隨時可用的示例。 在您的特定情況下,可能建議首先將文件保存到基於本地磁盤文件系統的緩存(例如,通過File#createTempFile()
和HTTP會話中的某些鍵),這樣您就不需要再次從外部服務獲取它然后再次。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.