Приложение My Grails подключается к другому приложению Grails, которое преобразует файл .pdf в файл .png, если файл .pdf представляет собой одностраничный файл, или .zip из файла .pngs, если файл .pdf содержит несколько страниц. Вот код конвертера:
class PdfToPngController {
def converterService
def convert() {
File originalFile = ...
File converted = converterService.convert(originalFile, "png")
InputStream inputStream = converted.newInputStream()
response.outputStream << inputStream
response.setContentLength(Long.valueOf(converted.length()).intValue())
response.setCharacterEncoding("UTF-8")
String mimeType
if(converted.endsWith(".png")) {
mimeType = "image/png"
}
else if(converted.endsWith(".zip")) {
mimeType = "application/zip"
}
response.contentType = mimeType
response.setHeader("Content-type", mimeType)
response.setContentType(mimeType)
response.setHeader("Content-disposition", "inline;filename=${converted.getName()}")
inputStream.close()
}
}
Мое приложение отправит файл PDF и будет ждать преобразованный файл в качестве ответа, проблема в том, что он возвращает null
, когда я пытаюсь получить тип содержимого ответа. Вот RESTClient на мое приложение:
RESTClient client = new RESTClient(grailsApplication.config.report.converter.base)
client.request(Method.POST) { multipartRequest ->
uri.path = grailsApplication.config.report.converter.path
// ...
response.success = { response, data ->
if(response.getStatus() == HttpServletResponse.SC_OK) {
println "getContentType: ${response.getEntity().getContentType()}"
// This prints
// getContentType: null
String extension
if(response.getEntity().getContentType() == "image/png")) {
extension = "png"
}
else if(response.getEntity().getContentType() == "application/zip")) {
extension = "zip"
}
OutputStream outputStream = new ByteArrayOutputStream()
response.entity.writeTo(outputStream)
byte[] byteArray = outputStream.toByteArray()
digest = md5.digest(byteArray)
hashedFilename = new BigInteger(1, digest).toString(36)
FileUtils.writeByteArrayToFile(new File(thumbnailsDir.getAbsolutePath() +
File.separator + hashedFilename +
"." + extension), byteArray)
outputStream.close()
}
else if(HttpServletResponse.SC_CREATED) {
throw new ConnectException("The report service failed to convert it to .png.")
}
}
}
Почему мое приложение не может определить contentType
ответа? Приложение конвертера устанавливает contentType
неправильно? Или я неверно определяю contentType
? Или это вина конвертирующего приложения?