package net.flibusta.servlet;
import net.flibusta.persistence.dao.BookDao;
import org.apache.commons.io.IOUtils;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
@Controller
public class DownloadController {
Logger logger = Logger.getLogger(DownloadController.class);
@Autowired
private BookDao bookDao;
@RequestMapping(value = "/download/{bookid}/{format}/{name}", method = RequestMethod.GET)
public void download(@PathVariable("bookid") String bookId, @PathVariable("format") String format, @PathVariable("name") String fileName,
HttpServletResponse response) throws IOException {
File file = bookDao.findBook(bookId, format);
if (file == null) {
response.setStatus(HttpStatus.NOT_FOUND.value());
logger.warn("File for download not found: bookId=" + bookId + " format=" + format + " name=" + fileName);
return;
}
logger.debug("Send file: bookId=" + bookId + " format=" + format + " name=" + fileName);
streamFile(file, format, response);
}
private void streamFile(File book, String outputFormat, HttpServletResponse response) throws IOException {
response.setContentType(getContentType(outputFormat));
response.setHeader("Content-Length", Long.toString(book.length()));
response.setHeader("Content-Disposition", "attachment; filename=" + book.getName());
ServletOutputStream outputStream = response.getOutputStream();
FileInputStream inputStream = new FileInputStream(book);
try {
IOUtils.copy(inputStream, outputStream);
} finally {
IOUtils.closeQuietly(inputStream);
IOUtils.closeQuietly(outputStream);
}
}
private String getContentType(String outputFormat) {
String mimeType;
if ("epub".equals(outputFormat)) {
mimeType = "application/epub+zip";
} else if ("mobi".equals(outputFormat)) {
mimeType = "application/x-mobipocket-ebook";
} else {
mimeType = "application/octetstream";
}
return mimeType;
}
}