/*
* JBoss, Home of Professional Open Source
* Copyright 2013, Red Hat, Inc. and/or its affiliates, and individual
* contributors by the @authors tag. See the copyright.txt in the
* distribution for a full listing of individual contributors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jboss.as.quickstart.xml.upload;
import java.io.IOException;
import java.io.InputStream;
import java.util.Collection;
import java.util.logging.Logger;
import javax.inject.Inject;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
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;
/**
* Simple servlet to handle multipart file upload. <br>
* This servlet register itself as handler for '/upload' path in application. When request is made with said context, this
* servlet is invoked to handle it. Once it is done, it redirects user agent to application root path.
*
* @author baranowb
*
*/
// Mark this class as servlet and indicates that requests to
// '/upload' URL in application be handled by this servlet.
@WebServlet(urlPatterns = { "/upload" })
// configure Servlet 3.0 multipart. Limit file size to 1MB.
@MultipartConfig(maxFileSize = 1048576L)
public class FileUploadServlet extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = 127759768859064589L;
private static final Logger logger = Logger.getLogger(FileUploadServlet.class.getName());
// name of form fields which are looked up in multipart request
public static final String INPUT_NAME = "file";
@Inject
private FileUploadBean fileUploadBean;
// override 'POST' handler. Appliction will use 'POST' to send 'multipart/form-data'
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/*
* check content type. Require 'multipart/form-data' header in most case contains more than value, some parameters are
* present so make a check with String.contains(String). send 406, with error message if it does not contain proper type
*/
final String reqContentType = req.getContentType();
if (!reqContentType.contains("multipart/form-data")) {
logger.severe("Received request which is not mulipart: " + reqContentType);
resp.sendError(406, "Received request which is not mulipart: " + reqContentType);
return;
}
/*
* In servlet 3.0, Parts carry form data. Get Parts and perform some name & type checks. Parts contain all data sent in
* form not only file, we need only file.
*/
Collection<Part> fileParts = req.getParts();
if (fileParts != null && fileParts.size() > 0) {
for (Part p : fileParts) {
String partContentType = p.getContentType();
String partName = p.getName();
if (partContentType != null && partContentType.equals("text/xml") && partName != null
&& partName.equals(INPUT_NAME)) {
InputStream is = p.getInputStream();
fileUploadBean.parseUpload(is);
break;
}
}
}
/*
* Fetch dispatcher for '/'. This will make 'rd' initialized to dispatcher handling for application root.
*/
RequestDispatcher rd = getServletContext().getRequestDispatcher("/");
if (rd != null) {
/*
* Forward the request to default servlet handling calls to application root. In our case FacesServlet
*/
rd.forward(req, resp);
return;
} else {
// this is bad thing, lets throw exception to make user aware of that?
throw new IllegalStateException("Container is not well!");
}
}
}