html/java, input file sympa avec bootstrap

2014-01-28

Dans le cadre d’un projet, j’ai redesigné un formulaire qui permet d’importer un fichier csv (utilise bootstrap).

Le rendu est le suivant :

     <form method="post" action="/somewhere" enctype="multipart/form-data" class="form-horizontal">
            <div class="control-group">
                <label class="control-label" for="fichier_csv">fichier.csv</label>
                <input type="file" id="fichier_csv" name="fichier_csv" style="display:none" />
                <div class="controls">
                    <div class="input-append">
                        <input id="fichier_path" class="input-large" type="text">
                        <a class="btn" onclick="$('input[id=fichier_csv]').click();">
                            <i class="icon-folder-open"></i>
                            <span>Sélectionner...</span>
                        </a>
                    </div>
                </div>
                <script type="text/javascript">
                    $('input[id=fichier_csv]').change(function() {
                        $('#fichier_path').val($(this).val());
                    });
                </script>
            </div>
	</form>

Le code java est le suivant (attention, lorsque le type du formulaire est enctype=“multipart/form-data”, les paramètres ne se récupèrent plus avec HttpServletRequest.getParameter):

   
// récupération des paramètres "autres" que le fichier CSV
if (isMultipartRequest(req)) {
            final DiskFileItemFactory factory = new DiskFileItemFactory();
            final ServletFileUpload upload = new ServletFileUpload(factory);
            upload.setSizeMax(FILE_MAX_SIZE);
            try {
                final List<FileItem> items = upload.parseRequest(req);
                final Iterator<FileItem> it = items.iterator();
                while (it.hasNext()) {
                    final FileItem item = it.next();
                    if (item.isFormField()) {
                        if ("action".equals(item.getFieldName())) {
                            action = item.getString();
                        } else if ("id".equals(item.getFieldName())) {
                            id = item.getString();
                        } else if ("nas".equals(item.getFieldName())) {
                            req.setAttribute("nas", item.getString());
                        }
                    }
                }
                req.setAttribute("fileupload_items", items);
            } catch (final FileUploadException e) {
                LOGGER.error(e);
                throw new RuntimeException(e);
            }
}

...


// récupération du fichier
        List<FileItem> items = (List<FileItem>) req.getAttribute("fileupload_items");
        StringWriter sw_fichier_csv = null;
        for (FileItem item : items) {
            try {
                if(item.isFormField()) {
                    req.setAttribute(item.getFieldName(), item.getString());
                } else {
                    if (item.getFieldName().equals("fichier_csv")) {
                        InputStream fis = item.getInputStream();
                        sw_fichier_csv = new StringWriter();
                        IOUtils.copy(fis, sw_fichier_csv);
                    }
                }
            } catch (IOException e) {
                throw new RuntimeException(e);
            } finally {
                item.delete();
            }
        }