package eu.geoknow.generator.servlets;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.codehaus.jackson.map.ObjectMapper;
import eu.geoknow.generator.utils.JsonResponse;
public class UploadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private String filePath;
private String tempData;
private int maxFileSize = 1024 * 1024;
private int maxMemSize = 4 * 1024;
public void init() {
// Get the file location where it would be stored.
filePath = getServletContext().getInitParameter("file-upload");
maxFileSize = Integer.parseInt(getServletContext().getInitParameter("max-file-size"));
maxMemSize = Integer.parseInt(getServletContext().getInitParameter("max-mem-size"));
tempData = getServletContext().getInitParameter("temp-data");
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setContentType("application/json");
PrintWriter out = response.getWriter();
JsonResponse res = new JsonResponse();
ObjectMapper mapper = new ObjectMapper();
boolean isMultipartContent = ServletFileUpload.isMultipartContent(request);
if (!isMultipartContent) {
res.setStatus("FAIL");
res.setMessage("Not a file.");
mapper.writeValue(out, res);
out.close();
return;
}
// Directory where files will be saved
ServletContext servletContext = getServletContext();
File tmpDataDir =
new File(servletContext.getRealPath(File.separator) + File.separator + tempData);
if (!tmpDataDir.exists()) {
tmpDataDir.mkdirs();
}
File seshdir = new File(servletContext.getRealPath(File.separator) + File.separator + filePath);
if (!seshdir.exists()) {
seshdir.mkdirs();
}
DiskFileItemFactory factory = new DiskFileItemFactory();
// maximum size that will be stored in memory
factory.setSizeThreshold(maxMemSize);
// Location to save data that is larger than maxMemSize.
factory.setRepository(tmpDataDir);
ServletFileUpload upload = new ServletFileUpload(factory);
// maximum file size to be uploaded.
upload.setSizeMax(maxFileSize);
try {
List<FileItem> fields = upload.parseRequest(request);
Iterator<FileItem> it = fields.iterator();
if (!it.hasNext()) {
res.setStatus("FAIL");
res.setMessage("No fields found");
mapper.writeValue(out, res);
out.close();
return;
}
for (FileItem diskFileItem : fields) {
// Exclude the form fields
if (diskFileItem.isFormField()) {
continue;
}
byte[] fileBytes = diskFileItem.get();
File file = new File(seshdir, diskFileItem.getName());
if (!file.exists())
file.createNewFile();
try {
FileOutputStream fileOutputStream = new FileOutputStream(file);
fileOutputStream.write(fileBytes);
fileOutputStream.flush();
fileOutputStream.close();
} catch (FileNotFoundException e) {
res.setStatus("FAIL");
res.setMessage(e.getMessage());
return;
}
res.addResult(file.getAbsolutePath());
}
res.setStatus("SUCESS");
res.setMessage("Successfuly uploaded");
} catch (FileUploadException e) {
res.setStatus("FAIL");
res.setMessage(e.getMessage());
}
mapper.writeValue(out, res);
out.close();
}
}