Como fazer upload de arquivos para o servidor usando JSP / Servlet?

688

Como posso fazer upload de arquivos para o servidor usando JSP / Servlet? Eu tentei isso:

<form action="upload" method="post">
    <input type="text" name="description" />
    <input type="file" name="file" />
    <input type="submit" />
</form>

No entanto, só recebo o nome do arquivo, não o conteúdo do arquivo. Quando adiciono enctype="multipart/form-data"ao <form>, request.getParameter()retorna null.

Durante a pesquisa, me deparei com o Apache Common FileUpload . Eu tentei isso:

FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
List items = upload.parseRequest(request); // This line is where it died.

Infelizmente, o servlet lançou uma exceção sem uma mensagem e causa claras. Aqui está o stacktrace:

SEVERE: Servlet.service() for servlet UploadServlet threw exception
javax.servlet.ServletException: Servlet execution threw an exception
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:313)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    at java.lang.Thread.run(Thread.java:637)
Thang Pham
fonte
Talvez este artigo será útil: baeldung.com/upload-file-servlet
Adam Gerard

Respostas:

1193

Introdução

Para procurar e selecionar um arquivo para upload, você precisa de um <input type="file">campo HTML no formulário. Conforme declarado na especificação HTML, você deve usar o POSTmétodo e o enctypeatributo do formulário deve ser definido como "multipart/form-data".

<form action="upload" method="post" enctype="multipart/form-data">
    <input type="text" name="description" />
    <input type="file" name="file" />
    <input type="submit" />
</form>

Depois de enviar esse formulário, os dados binários do formulário com várias partes ficam disponíveis no corpo da solicitação em um formato diferente do que quando enctypenão está definido.

Antes do Servlet 3.0, a API do Servlet não suportava nativamente multipart/form-data. Ele suporta apenas o tipo de formulário padrão de application/x-www-form-urlencoded. Todos os request.getParameter()consorts e retornariam nullao usar dados de formulário com várias partes. Foi aqui que o conhecido Apache Commons FileUpload entrou em cena.

Não o analise manualmente!

Em teoria, você pode analisar o corpo da solicitação com base em ServletRequest#getInputStream(). No entanto, este é um trabalho preciso e tedioso que requer conhecimento preciso do RFC2388 . Você não deve tentar fazer isso sozinho ou copipar algum código caseiro sem biblioteca encontrado em outro lugar na Internet. Muitas fontes online falharam bastante nisso, como roseindia.net. Veja também o upload do arquivo pdf . Você deveria usar uma biblioteca real que é usada (e implicitamente testada!) Por milhões de usuários por anos. Essa biblioteca provou sua robustez.

Quando você já estiver no Servlet 3.0 ou mais recente, use a API nativa

Se você estiver usando pelo menos o Servlet 3.0 (Tomcat 7, Jetty 9, JBoss AS 6, GlassFish 3, etc.), poderá usar a API padrão fornecida HttpServletRequest#getPart()para coletar os itens de dados de formulário de várias partes individuais (a maioria das implementações do Servlet 3.0 realmente usa Apache Commons FileUpload sob as capas para isso!). Além disso, os campos normais do formulário estão disponíveis getParameter()da maneira usual.

Primeiro anote seu servlet @MultipartConfigpara permitir que ele reconheça e multipart/form-datadê suporte a solicitações e, assim, comece getPart()a trabalhar:

@WebServlet("/upload")
@MultipartConfig
public class UploadServlet extends HttpServlet {
    // ...
}

Em seguida, implemente da doPost()seguinte maneira:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String description = request.getParameter("description"); // Retrieves <input type="text" name="description">
    Part filePart = request.getPart("file"); // Retrieves <input type="file" name="file">
    String fileName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString(); // MSIE fix.
    InputStream fileContent = filePart.getInputStream();
    // ... (do your job here)
}

Observe o Path#getFileName(). Esta é uma correção do MSIE para obter o nome do arquivo. Esse navegador envia incorretamente o caminho completo do arquivo ao longo do nome, em vez de apenas o nome do arquivo.

Caso você tenha um <input type="file" name="file" multiple="true" />upload para vários arquivos, colete-os como abaixo (infelizmente não existe um método como esse request.getParts("file")):

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // ...
    List<Part> fileParts = request.getParts().stream().filter(part -> "file".equals(part.getName()) && part.getSize() > 0).collect(Collectors.toList()); // Retrieves <input type="file" name="file" multiple="true">

    for (Part filePart : fileParts) {
        String fileName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString(); // MSIE fix.
        InputStream fileContent = filePart.getInputStream();
        // ... (do your job here)
    }
}

Quando você ainda não estiver no Servlet 3.1, obtenha manualmente o nome do arquivo enviado

Observe que Part#getSubmittedFileName()foi introduzido no Servlet 3.1 (Tomcat 8, Jetty 9, WildFly 8, GlassFish 4, etc.). Se você ainda não estiver no Servlet 3.1, precisará de um método utilitário adicional para obter o nome do arquivo enviado.

private static String getSubmittedFileName(Part part) {
    for (String cd : part.getHeader("content-disposition").split(";")) {
        if (cd.trim().startsWith("filename")) {
            String fileName = cd.substring(cd.indexOf('=') + 1).trim().replace("\"", "");
            return fileName.substring(fileName.lastIndexOf('/') + 1).substring(fileName.lastIndexOf('\\') + 1); // MSIE fix.
        }
    }
    return null;
}
String fileName = getSubmittedFileName(filePart);

Observe a correção do MSIE para obter o nome do arquivo. Esse navegador envia incorretamente o caminho completo do arquivo ao longo do nome, em vez de apenas o nome do arquivo.

Quando você ainda não estiver no Servlet 3.0, use o Apache Commons FileUpload

Se você ainda não está no Servlet 3.0 (não é hora de atualizar?), A prática comum é usar o Apache Commons FileUpload para analisar as solicitações de dados de formulário de várias partes. Possui um excelente Guia do Usuário e Perguntas frequentes (passe cuidadosamente por ambos). Há também o O'Reilly (" cos ") MultipartRequest, mas possui alguns bugs (menores) e não é mais mantido ativamente por anos. Eu não recomendaria usá-lo. O Apache Commons FileUpload ainda é mantido ativamente e atualmente está muito maduro.

Para usar o Apache Commons FileUpload, você precisa ter pelo menos os seguintes arquivos nos aplicativos da web /WEB-INF/lib:

Sua tentativa inicial falhou muito provavelmente porque você esqueceu o IO comum.

Aqui está um exemplo de como o doPost()seu UploadServletpode parecer ao usar o Apache Commons FileUpload:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    try {
        List<FileItem> items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
        for (FileItem item : items) {
            if (item.isFormField()) {
                // Process regular form field (input type="text|radio|checkbox|etc", select, etc).
                String fieldName = item.getFieldName();
                String fieldValue = item.getString();
                // ... (do your job here)
            } else {
                // Process form file field (input type="file").
                String fieldName = item.getFieldName();
                String fileName = FilenameUtils.getName(item.getName());
                InputStream fileContent = item.getInputStream();
                // ... (do your job here)
            }
        }
    } catch (FileUploadException e) {
        throw new ServletException("Cannot parse multipart request.", e);
    }

    // ...
}

É muito importante que você não chamar getParameter(), getParameterMap(), getParameterValues(), getInputStream(), getReader(), etc no mesmo pedido de antemão. Caso contrário, o contêiner do servlet lerá e analisará o corpo da solicitação e, portanto, o Apache Commons FileUpload receberá um corpo de solicitação vazio. Consulte também ao ServletFileUpload # parseRequest (request) retorna uma lista vazia .

Observe o FilenameUtils#getName(). Esta é uma correção do MSIE para obter o nome do arquivo. Esse navegador envia incorretamente o caminho completo do arquivo ao longo do nome, em vez de apenas o nome do arquivo.

Como alternativa, você também pode agrupar tudo em um Filterque analisa tudo automaticamente e colocar as coisas de volta no mapa de parâmetros da solicitação, para que você possa continuar usando request.getParameter()a maneira usual e recuperar o arquivo enviado por request.getAttribute(). Você pode encontrar um exemplo neste artigo do blog .

Solução alternativa para o erro do GlassFish3 de getParameter()retornarnull

Observe que as versões do Glassfish anteriores à 3.1.2 tinham um erro no qual o getParameter()still ainda retorna null. Se você estiver direcionando esse contêiner e não puder atualizá-lo, precisará extrair o valor getPart()com a ajuda deste método utilitário:

private static String getValue(Part part) throws IOException {
    BufferedReader reader = new BufferedReader(new InputStreamReader(part.getInputStream(), "UTF-8"));
    StringBuilder value = new StringBuilder();
    char[] buffer = new char[1024];
    for (int length = 0; (length = reader.read(buffer)) > 0;) {
        value.append(buffer, 0, length);
    }
    return value.toString();
}
String description = getValue(request.getPart("description")); // Retrieves <input type="text" name="description">

Salvando o arquivo enviado (não use getRealPath()nem part.write()!)

Vá para as seguintes respostas para obter detalhes sobre como salvar corretamente o obtido InputStream(a fileContentvariável mostrada nos trechos de código acima) em disco ou banco de dados:

Servindo arquivo carregado

Vá para as seguintes respostas para obter detalhes sobre como enviar corretamente o arquivo salvo do disco ou banco de dados para o cliente:

Ajaxificando o formulário

Vá para as respostas a seguir como fazer upload usando o Ajax (e jQuery). Observe que o código do servlet para coletar os dados do formulário não precisa ser alterado para isso! Somente a maneira como você responde pode ser alterada, mas isso é bastante trivial (ou seja, em vez de encaminhar para JSP, basta imprimir algum JSON ou XML ou mesmo texto sem formatação, dependendo do que o script responsável pela chamada do Ajax estiver esperando).


Espero que tudo isso ajude :)

BalusC
fonte
Ah desculpe, eu estava vendo request.getParts("file")e foi confundido x_x
Kagami Sascha Rosylight
Com o Servlet 3.0, se uma MultipartConfigcondição for violada (por exemplo maxFileSize:), a chamada request.getParameter()retornará nulo. Isso é de propósito? E se eu receber alguns parâmetros regulares (texto) antes de chamar getPart(e procurar por um IllegalStateException)? Isso faz com que um NullPointerExceptionseja lançado antes que eu tenha a chance de verificar o IllegalStateException.
theyuv
@BalusC Criei um post relacionado a isso. Você tem uma idéia de como recuperar informações adicionais da API do arquivo webKitDirectory? Mais detalhes aqui stackoverflow.com/questions/45419598/…
Rapster
Se você não está no Servlet 3.0 e usa o truque FileUpload, descobri que não é possível ler o arquivo da solicitação mais de uma vez. Se você precisar dessa funcionalidade, poderá consultar o MultiPartFilter do Spring. Esta postagem tem um bom exemplo de trabalho: stackoverflow.com/a/21448087/1048376
splashout
1
Sim, se alguém tentar usar o código em 3,0 seção com tomcat 7, eles podem enfrentar assunto em String fileName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString(); // MSIE fix.parte semelhante a mim
raviraja
26

Se você usa o Spring MVC, é assim: (vou deixar isso aqui caso alguém ache útil).

Use um formulário com enctypeatributo definido como " multipart/form-data" (Igual à resposta do BalusC)

<form action="upload" method="post" enctype="multipart/form-data">
    <input type="file" name="file" />
    <input type="submit" value="Upload"/>
</form>

No seu controlador, mapeie o parâmetro request filepara MultipartFiledigitar da seguinte maneira:

@RequestMapping(value = "/upload", method = RequestMethod.POST)
public void handleUpload(@RequestParam("file") MultipartFile file) throws IOException {
    if (!file.isEmpty()) {
            byte[] bytes = file.getBytes(); // alternatively, file.getInputStream();
            // application logic
    }
}

Você pode obter o nome do arquivo e o tamanho usando MultipartFile's getOriginalFilename()e getSize().

Eu testei isso com a versão Spring 4.1.1.RELEASE.

Amila
fonte
Se não me engano, isso requer que você configure um feijão em config aplicação do seu servidor ...
Kenny Worden
11

Você precisa que o common-io.1.4.jararquivo seja incluído no seu libdiretório ou, se estiver trabalhando em algum editor, como o NetBeans, precisará ir às propriedades do projeto e apenas adicionar o arquivo JAR e pronto.

Para obter o common.io.jararquivo, basta pesquisar no Google ou acessar o site do Apache Tomcat , onde você tem a opção de fazer o download gratuito desse arquivo. Mas lembre-se de uma coisa: baixe o arquivo ZIP binário se você for um usuário do Windows.

Pranav
fonte
Não consigo encontrar, .jarmas .zip. Você quer dizer .zip?
Malwinder Singh
10

Sem componente ou biblioteca externa no Tomcat 6 ou 7

Ativando o Upload no arquivo web.xml :

http://joseluisbz.wordpress.com/2014/01/17/manually-installing-php-tomcat-and-httpd-lounge/#Enabled%20File%20Uploads .

<servlet>
    <servlet-name>jsp</servlet-name>
    <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
    <multipart-config>
      <max-file-size>3145728</max-file-size>
      <max-request-size>5242880</max-request-size>
    </multipart-config>
    <init-param>
        <param-name>fork</param-name>
        <param-value>false</param-value>
    </init-param>
    <init-param>
        <param-name>xpoweredBy</param-name>
        <param-value>false</param-value>
    </init-param>
    <load-on-startup>3</load-on-startup>
</servlet>

COMO VOCÊ PODE VER :

    <multipart-config>
      <max-file-size>3145728</max-file-size>
      <max-request-size>5242880</max-request-size>
    </multipart-config>

Fazendo upload de arquivos usando JSP. Arquivos:

No arquivo html

<form method="post" enctype="multipart/form-data" name="Form" >

  <input type="file" name="fFoto" id="fFoto" value="" /></td>
  <input type="file" name="fResumen" id="fResumen" value=""/>

No arquivo JSP ou no servlet

    InputStream isFoto = request.getPart("fFoto").getInputStream();
    InputStream isResu = request.getPart("fResumen").getInputStream();
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    byte buf[] = new byte[8192];
    int qt = 0;
    while ((qt = isResu.read(buf)) != -1) {
      baos.write(buf, 0, qt);
    }
    String sResumen = baos.toString();

Editar seu código aos requisitos do servlet, como o arquivo de tamanho máximo , max-pedido de tamanho e outras opções que você pode definir ...

joseluisbz
fonte
9

Estou usando o Servlet comum para todos os formulários HTML, tenham ou não anexos. Este Servlet retorna um local TreeMaponde as chaves são jsp name Parâmetros e valores são Entradas do usuário e salva todos os anexos no diretório fixo e, posteriormente, você renomeia o diretório de sua escolha. Aqui Connections é a nossa interface personalizada com objeto de conexão. Eu acho que isso vai te ajudar

public class ServletCommonfunctions extends HttpServlet implements
        Connections {

    private static final long serialVersionUID = 1L;

    public ServletCommonfunctions() {}

    protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException,
            IOException {}

    public SortedMap<String, String> savefilesindirectory(
            HttpServletRequest request, HttpServletResponse response)
            throws IOException {
        // Map<String, String> key_values = Collections.synchronizedMap( new
        // TreeMap<String, String>());
        SortedMap<String, String> key_values = new TreeMap<String, String>();
        String dist = null, fact = null;
        PrintWriter out = response.getWriter();
        File file;
        String filePath = "E:\\FSPATH1\\2KL06CS048\\";
        System.out.println("Directory Created   ????????????"
            + new File(filePath).mkdir());
        int maxFileSize = 5000 * 1024;
        int maxMemSize = 5000 * 1024;
        // Verify the content type
        String contentType = request.getContentType();
        if ((contentType.indexOf("multipart/form-data") >= 0)) {
            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(new File(filePath));
            // Create a new file upload handler
            ServletFileUpload upload = new ServletFileUpload(factory);
            // maximum file size to be uploaded.
            upload.setSizeMax(maxFileSize);
            try {
                // Parse the request to get file items.
                @SuppressWarnings("unchecked")
                List<FileItem> fileItems = upload.parseRequest(request);
                // Process the uploaded file items
                Iterator<FileItem> i = fileItems.iterator();
                while (i.hasNext()) {
                    FileItem fi = (FileItem) i.next();
                    if (!fi.isFormField()) {
                        // Get the uploaded file parameters
                        String fileName = fi.getName();
                        // Write the file
                        if (fileName.lastIndexOf("\\") >= 0) {
                            file = new File(filePath
                                + fileName.substring(fileName
                                        .lastIndexOf("\\")));
                        } else {
                            file = new File(filePath
                                + fileName.substring(fileName
                                        .lastIndexOf("\\") + 1));
                        }
                        fi.write(file);
                    } else {
                        key_values.put(fi.getFieldName(), fi.getString());
                    }
                }
            } catch (Exception ex) {
                System.out.println(ex);
            }
        }
        return key_values;
    }
}
se sentir bem e programação
fonte
@buhake sindi hey o que deve ser o filepath se im usando o servidor ao vivo ou eu vivo meu projeto pelo upload de arquivos para o servidor
Amans
2
Qualquer diretório no server.if ao vivo você escrever um código para criar um diretório no servlet, em seguida, diretório será criado em srver ao vivo
sensação boa e programação
8

Para o Spring MVC, venho tentando há horas fazer isso e consegui ter uma versão mais simples que funcionava para assumir a entrada de formulário, dados e imagem.

<form action="/handleform" method="post" enctype="multipart/form-data">
  <input type="text" name="name" />
  <input type="text" name="age" />
  <input type="file" name="file" />
  <input type="submit" />
</form>

Controlador para manusear

@Controller
public class FormController {
    @RequestMapping(value="/handleform",method= RequestMethod.POST)
    ModelAndView register(@RequestParam String name, @RequestParam int age, @RequestParam MultipartFile file)
            throws ServletException, IOException {

        System.out.println(name);
        System.out.println(age);
        if(!file.isEmpty()){
            byte[] bytes = file.getBytes();
            String filename = file.getOriginalFilename();
            BufferedOutputStream stream =new BufferedOutputStream(new FileOutputStream(new File("D:/" + filename)));
            stream.write(bytes);
            stream.flush();
            stream.close();
        }
        return new ModelAndView("index");
    }
}

Espero que ajude :)

Shivangi Gupta
fonte
Você pode compartilhar o select image form db mysql e mostrá-lo em jsp / html?
Ved Prakash
6

Outra fonte desse problema ocorre se você estiver usando o Geronimo com o Tomcat incorporado. Nesse caso, depois de muitas iterações de teste do commons-io e commons-fileupload, o problema surge de um carregador de classe pai manipulando os jars commons-xxx. Isso tem que ser evitado. A falha sempre ocorria em:

fileItems = uploader.parseRequest(request);

Observe que o tipo de lista de fileItems foi alterado com a versão atual do commons-fileupload para ser especificamente diferente das List<FileItem>versões anteriores em que era genérico List.

Adicionei o código-fonte para commons-fileupload e commons-io no meu projeto Eclipse para rastrear o erro real e finalmente obtive algumas dicas. Primeiro, a exceção lançada é do tipo Throwable, não a FileIOException declarada nem a Exception (elas não serão interceptadas). Segundo, a mensagem de erro é ofuscante, pois afirmou que a classe não foi encontrada porque o eixo2 não pôde encontrar o commons-io. O Axis2 não é usado no meu projeto, mas existe como uma pasta no subdiretório do repositório Geronimo como parte da instalação padrão.

Finalmente, encontrei um lugar que apresentava uma solução funcional que resolveu meu problema com êxito. Você deve ocultar os frascos do carregador pai no plano de implantação. Isso foi colocado em geronimo-web.xml com meu arquivo completo mostrado abaixo.

Pasted from <http://osdir.com/ml/user-geronimo-apache/2011-03/msg00026.html> 



<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<web:web-app xmlns:app="http://geronimo.apache.org/xml/ns/j2ee/application-2.0" xmlns:client="http://geronimo.apache.org/xml/ns/j2ee/application-client-2.0" xmlns:conn="http://geronimo.apache.org/xml/ns/j2ee/connector-1.2" xmlns:dep="http://geronimo.apache.org/xml/ns/deployment-1.2" xmlns:ejb="http://openejb.apache.org/xml/ns/openejb-jar-2.2" xmlns:log="http://geronimo.apache.org/xml/ns/loginconfig-2.0" xmlns:name="http://geronimo.apache.org/xml/ns/naming-1.2" xmlns:pers="http://java.sun.com/xml/ns/persistence" xmlns:pkgen="http://openejb.apache.org/xml/ns/pkgen-2.1" xmlns:sec="http://geronimo.apache.org/xml/ns/security-2.0" xmlns:web="http://geronimo.apache.org/xml/ns/j2ee/web-2.0.1">
    <dep:environment>
        <dep:moduleId>
            <dep:groupId>DataStar</dep:groupId>
            <dep:artifactId>DataStar</dep:artifactId>
            <dep:version>1.0</dep:version>
            <dep:type>car</dep:type>
        </dep:moduleId>

<!--Don't load commons-io or fileupload from parent classloaders-->
        <dep:hidden-classes>
            <dep:filter>org.apache.commons.io</dep:filter>
            <dep:filter>org.apache.commons.fileupload</dep:filter>
        </dep:hidden-classes>
        <dep:inverse-classloading/>        


    </dep:environment>
    <web:context-root>/DataStar</web:context-root>
</web:web-app>
Geoffrey Malafsky
fonte
0

Aqui está um exemplo usando o apache commons-fileupload:

// apache commons-fileupload to handle file upload
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setRepository(new File(DataSources.TORRENTS_DIR()));
ServletFileUpload fileUpload = new ServletFileUpload(factory);

List<FileItem> items = fileUpload.parseRequest(req.raw());
FileItem item = items.stream()
  .filter(e ->
  "the_upload_name".equals(e.getFieldName()))
  .findFirst().get();
String fileName = item.getName();

item.write(new File(dir, fileName));
log.info(fileName);
thouliha
fonte
0

A maneira mais simples seria criar arquivos e controles de entrada, sem um bilhão de bibliotecas:

  <%
  if (request.getContentType()==null) return;
  // for input type=text controls
  String v_Text = 
  (new BufferedReader(new InputStreamReader(request.getPart("Text1").getInputStream()))).readLine();    

  // for input type=file controls
  InputStream inStr = request.getPart("File1").getInputStream();
  char charArray[] = new char[inStr.available()];
  new InputStreamReader(inStr).read(charArray);
  String contents = new String(charArray);
  %>
acesso concedido
fonte
-1

você pode fazer upload de arquivo usando jsp / servlet.

<form action="UploadFileServlet" method="post">
  <input type="text" name="description" />
  <input type="file" name="file" />
  <input type="submit" />
</form>

por outro lado, do servidor. use o seguinte código.

     package com.abc..servlet;

import java.io.File;
---------
--------


/**
 * Servlet implementation class UploadFileServlet
 */
public class UploadFileServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public UploadFileServlet() {
        super();
        // TODO Auto-generated constructor stub
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        response.sendRedirect("../jsp/ErrorPage.jsp");
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub

            PrintWriter out = response.getWriter();
            HttpSession httpSession = request.getSession();
            String filePathUpload = (String) httpSession.getAttribute("path")!=null ? httpSession.getAttribute("path").toString() : "" ;

            String path1 =  filePathUpload;
            String filename = null;
            File path = null;
            FileItem item=null;


            boolean isMultipart = ServletFileUpload.isMultipartContent(request);

            if (isMultipart) {
                FileItemFactory factory = new DiskFileItemFactory();
                ServletFileUpload upload = new ServletFileUpload(factory);
                String FieldName = "";
                try {
                    List items = upload.parseRequest(request);
                    Iterator iterator = items.iterator();
                    while (iterator.hasNext()) {
                         item = (FileItem) iterator.next();

                            if (fieldname.equals("description")) {
                                description = item.getString();
                            }
                        }
                        if (!item.isFormField()) {
                            filename = item.getName();
                            path = new File(path1 + File.separator);
                            if (!path.exists()) {
                                boolean status = path.mkdirs();
                            }
                            /* START OF CODE FRO PRIVILEDGE*/

                            File uploadedFile = new File(path + Filename);  // for copy file
                            item.write(uploadedFile);
                            }
                        } else {
                            f1 = item.getName();
                        }

                    } // END OF WHILE 
                    response.sendRedirect("welcome.jsp");
                } catch (FileUploadException e) {
                    e.printStackTrace();
                } catch (Exception e) {
                    e.printStackTrace();
                } 
            }   
    }

}
Mitul Maheshwari
fonte
-1
DiskFileUpload upload=new DiskFileUpload();

A partir deste objeto, você precisa obter itens e campos de arquivo, para que possa armazenar no servidor da seguinte maneira:

String loc="./webapps/prjct name/server folder/"+contentid+extension;
File uploadFile=new File(loc);
item.write(uploadFile);
Mahender Reddy Yasa
fonte
-2

Enviando vários arquivos por arquivo, temos que usar enctype="multipart/form-data"
e enviar vários arquivos multiple="multiple"na tag de entrada

<form action="upload" method="post" enctype="multipart/form-data">
 <input type="file" name="fileattachments"  multiple="multiple"/>
 <input type="submit" />
</form>
Rohan Kamat
fonte
2
Como procederíamos com getPart ("fileattachments") para obter uma matriz de peças? Eu não acho que getPart para vários arquivos funcionará?
CyberMew
-2

PÁGINA HTML

<html>
<head>
<title>File Uploading Form</title>
</head>
<body>
<h3>File Upload:</h3>
Select a file to upload: <br />
<form action="UploadServlet" method="post"
                        enctype="multipart/form-data">
<input type="file" name="file" size="50" />
<br />
<input type="submit" value="Upload File" />
</form>
</body>
</html> 

ARQUIVO DE SERVLET

// Import required java libraries
import java.io.*;
import java.util.*;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
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.apache.commons.io.output.*;

public class UploadServlet extends HttpServlet {

   private boolean isMultipart;
   private String filePath;
   private int maxFileSize = 50 * 1024;
   private int maxMemSize = 4 * 1024;
   private File file ;

   public void init( ){
      // Get the file location where it would be stored.
      filePath = 
             getServletContext().getInitParameter("file-upload"); 
   }
   public void doPost(HttpServletRequest request, 
               HttpServletResponse response)
              throws ServletException, java.io.IOException {
      // Check that we have a file upload request
      isMultipart = ServletFileUpload.isMultipartContent(request);
      response.setContentType("text/html");
      java.io.PrintWriter out = response.getWriter( );
      if( !isMultipart ){
         out.println("<html>");
         out.println("<head>");
         out.println("<title>Servlet upload</title>");  
         out.println("</head>");
         out.println("<body>");
         out.println("<p>No file uploaded</p>"); 
         out.println("</body>");
         out.println("</html>");
         return;
      }
      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(new File("c:\\temp"));

      // Create a new file upload handler
      ServletFileUpload upload = new ServletFileUpload(factory);
      // maximum file size to be uploaded.
      upload.setSizeMax( maxFileSize );

      try{ 
      // Parse the request to get file items.
      List fileItems = upload.parseRequest(request);

      // Process the uploaded file items
      Iterator i = fileItems.iterator();

      out.println("<html>");
      out.println("<head>");
      out.println("<title>Servlet upload</title>");  
      out.println("</head>");
      out.println("<body>");
      while ( i.hasNext () ) 
      {
         FileItem fi = (FileItem)i.next();
         if ( !fi.isFormField () )  
         {
            // Get the uploaded file parameters
            String fieldName = fi.getFieldName();
            String fileName = fi.getName();
            String contentType = fi.getContentType();
            boolean isInMemory = fi.isInMemory();
            long sizeInBytes = fi.getSize();
            // Write the file
            if( fileName.lastIndexOf("\\") >= 0 ){
               file = new File( filePath + 
               fileName.substring( fileName.lastIndexOf("\\"))) ;
            }else{
               file = new File( filePath + 
               fileName.substring(fileName.lastIndexOf("\\")+1)) ;
            }
            fi.write( file ) ;
            out.println("Uploaded Filename: " + fileName + "<br>");
         }
      }
      out.println("</body>");
      out.println("</html>");
   }catch(Exception ex) {
       System.out.println(ex);
   }
   }
   public void doGet(HttpServletRequest request, 
                       HttpServletResponse response)
        throws ServletException, java.io.IOException {

        throw new ServletException("GET method used with " +
                getClass( ).getName( )+": POST method required.");
   } 
}

web.xml

Compile acima do servlet UploadServlet e crie a entrada necessária no arquivo web.xml da seguinte maneira.

<servlet>
   <servlet-name>UploadServlet</servlet-name>
   <servlet-class>UploadServlet</servlet-class>
</servlet>

<servlet-mapping>
   <servlet-name>UploadServlet</servlet-name>
   <url-pattern>/UploadServlet</url-pattern>
</servlet-mapping>
Himanshu Patel
fonte