package fi.otavanopisto.muikku.files;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.inject.Inject;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import org.apache.commons.io.IOUtils;
import org.codehaus.jackson.map.ObjectMapper;
import fi.otavanopisto.muikku.controller.SystemSettingsController;
import fi.otavanopisto.muikku.files.TempFileUtils;
@MultipartConfig
@WebServlet("/tempFileUploadServlet")
public class TempFileUploadServlet extends HttpServlet {
private static final long serialVersionUID = -4689635910226270913L;
@Inject
private SystemSettingsController systemSettingsController;
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Part file = req.getPart("file");
long fileSizeLimit = systemSettingsController.getUploadFileSizeLimit();
if (file.getSize() > fileSizeLimit) {
resp.setStatus(HttpServletResponse.SC_REQUEST_ENTITY_TOO_LARGE);
return;
}
File tempFile = TempFileUtils.createTempFile();
FileOutputStream fileOutputStream = new FileOutputStream(tempFile);
try {
IOUtils.copy(file.getInputStream(), fileOutputStream);
} finally {
fileOutputStream.flush();
fileOutputStream.close();
}
Map<String, String> output = new HashMap<>();
output.put("fileId", tempFile.getName());
String fileName = getFileName(file);
if (fileName != null) {
output.put("fileContentType", getServletContext().getMimeType(fileName));
}
resp.setContentType("application/json");
ServletOutputStream servletOutputStream = resp.getOutputStream();
try {
(new ObjectMapper()).writeValue(servletOutputStream, output);
} finally {
servletOutputStream.flush();
}
}
private String getFileName(final Part part) {
for (String content : part.getHeader("content-disposition").split(";")) {
if (content.trim().startsWith("filename")) {
return content.substring(content.indexOf('=') + 1).trim().replace("\"", "");
}
}
return null;
}
}