여기 또 다른 예가 있습니다. 을 통해 QRCode를 PNG로 만들고 ByteArrayOutputStream
있습니다. 리소스는 Response
객체를 반환 하고 스트림의 데이터는 엔티티입니다.
응답 코드 처리를 설명하기 위해, 나는 캐시 헤더 (의 처리를 추가 한 If-modified-since
, If-none-matches
등).
@Path("{externalId}.png")
@GET
@Produces({"image/png"})
public Response getAsImage(@PathParam("externalId") String externalId,
@Context Request request) throws WebApplicationException {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
// do something with externalId, maybe retrieve an object from the
// db, then calculate data, size, expirationTimestamp, etc
try {
// create a QRCode as PNG from data
BitMatrix bitMatrix = new QRCodeWriter().encode(
data,
BarcodeFormat.QR_CODE,
size,
size
);
MatrixToImageWriter.writeToStream(bitMatrix, "png", stream);
} catch (Exception e) {
// ExceptionMapper will return HTTP 500
throw new WebApplicationException("Something went wrong …")
}
CacheControl cc = new CacheControl();
cc.setNoTransform(true);
cc.setMustRevalidate(false);
cc.setNoCache(false);
cc.setMaxAge(3600);
EntityTag etag = new EntityTag(HelperBean.md5(data));
Response.ResponseBuilder responseBuilder = request.evaluatePreconditions(
updateTimestamp,
etag
);
if (responseBuilder != null) {
// Preconditions are not met, returning HTTP 304 'not-modified'
return responseBuilder
.cacheControl(cc)
.build();
}
Response response = Response
.ok()
.cacheControl(cc)
.tag(etag)
.lastModified(updateTimestamp)
.expires(expirationTimestamp)
.type("image/png")
.entity(stream.toByteArray())
.build();
return response;
}
stream.toByteArray()
메모리가없는 현명한 경우 나를 때리지 마십시오 :) 내 <1KB PNG 파일에서 작동합니다 ...
Response
. 이렇게하면 미디어 유형, HTTP 응답 코드 등을 쉽게 제어 할 수 있습니다. 코드를 게시하려면 알려주세요.