A media server manages storage, organization, and delivery of digital media assets. Java provides a robust foundation for building such systems, offering features for network communication and file handling. This example outlines a core architectural model for a server and demonstrates fundamental file operations using RESTful web services.
Typical media server components include:
- Data Storage: Media file repositories, such as databases or file systems.
- Asset Management: Capabilities for uploading, retrieving, and modifying media.
- Media Delivery: Protocols like HTTP or RTMP for streaming files to clients.
- Access Control: Systems to enforce user permissions on media resources.
A minimal implementation focuses on two primary operations: ingesting files from clients and serving them for download.
File Upload Endpoint
The following JAX-RS resource receives a file via an HTTP POST request and saves it to the server.
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.io.*;
@Path("/media")
public class MediaResourceHandler {
private static final String STORAGE_PATH = "/server/storage/uploaded_content.dat";
@POST
@Path("/ingest")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response storeMediaAsset(InputStream incomingData) {
try (FileOutputStream fileOut = new FileOutputStream(STORAGE_PATH)) {
byte[] dataChunk = new byte[4096];
int bytesRead;
while ((bytesRead = incomingData.read(dataChunk)) != -1) {
fileOut.write(dataChunk, 0, bytesRead);
}
return Response.ok("Media asset stored successfully.").build();
} catch (IOException e) {
return Response.serverError().entity("Failed to store media asset.").build();
}
}
}
File Download Ednpoint
This endpoint handles GET requests to retrieve and download the stored file.
import javax.ws.rs.*;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.StreamingOutput;
import java.io.*;
@Path("/media")
public class MediaResourceHandler {
private static final String STORAGE_PATH = "/server/storage/uploaded_content.dat";
@GET
@Path("/retrieve")
public Response fetchMediaAsset() {
File mediaFile = new File(STORAGE_PATH);
if (!mediaFile.exists()) {
return Response.status(Response.Status.NOT_FOUND).entity("Media asset not found.").build();
}
StreamingOutput outputStream = output -> {
try (FileInputStream fileIn = new FileInputStream(mediaFile)) {
byte[] buffer = new byte[8192];
int bytesCopied;
while ((bytesCopied = fileIn.read(buffer)) != -1) {
output.write(buffer, 0, bytesCopied);
}
}
};
return Response
.ok(outputStream, "application/octet-stream")
.header("Content-Disposition", "attachment; filename=\"downloaded_media.dat\"")
.build();
}
}