Добавить входной файл с JSF 1.2

I need to upload in a form dedicated to upload files. In my project I can use JSF 1.2 and RichFaces 3.3.3 but I can't use the because my client wants a simple input, just like <input type="file"/>.

Если бы я мог использовать загрузку файлов Primeface или Tomahawk, но мне запрещено, я не могу использовать другие библиотеки, я также не могу использовать загрузку файла Apache 3.0 для Apache. Что я могу сделать сейчас? Я видел другие подобные вопросы, но они могли использовать другие библиотеки, я просто не могу, я ограничен ...

1
nl ja de
Было бы проще использовать сторонний элемент управления или библиотеку. Поскольку это не вариант, вам придется начать чтение спецификации MIME, поскольку вы собираетесь писать MIME-парсер.
добавлено автор McDowell, источник
Почему голос? Комментарий вместо проголосовать и уйти ¬¬
добавлено автор José Roberto Araújo Júnior, источник
@McDowell Да, я знаю, что это было бы проще, я также сделал версию, используя lib, и она была отвергнута:/Я в настоящее время пытаюсь использовать сервлет для получения файла ...
добавлено автор José Roberto Araújo Júnior, источник

3 ответы

Прошло некоторое время с тех пор, как мне пришлось написать MIME-парсер для JSF, но это то, что я помню о процессе.

Вам нужно будет написать парсер для извлечения данных из полезной нагрузки multi-part/formdata . Существует хороший обзор multi-part/formdata на сайте W3 .

Вам нужно будет решить, следует ли указывать:

  • сервлет без JSF с простой формой/элементами управления
  • сервлет JSF с формой JSF и пользовательским контролем загрузки файлов

Ориентация на простой сервлет

Это будет более простой подход, если при загрузке POST-действия не требуется вызывать код, который полагается быть в контексте JSF (управляемые компоненты и т. Д.),

Ваш сервлет анализирует данные из входного потока и воздействует на него соответствующим образом.

Ориентация на представление/действие JSF

Здесь вам нужно будет оформлять запрос (в идеале < код> HttpServletRequestWrapper ), чтобы предоставить проанализированный параметров в структуру JSF. Обычно это делается в фильтре , который обнаруживает post type из заголовков HTTP. Необходимо принять решение о том, где хранятся данные файла, до вызова любых действий формы и того, как вы собираетесь подвергать эти данные управляемым компонентам.

Вам также необходимо рассмотреть вопрос о том, собираетесь ли вы создать настраиваемый элемент управления JSF для типа ввода файла для загрузки или вы можете избежать простых элементов HTML.

Стоит изучить особенности парсеров/элементов управления, которые вы не можете использовать, чтобы обеспечить простые функции - например, максимальный размер полезной нагрузки, чтобы злоумышленники не загружали гигабайты данных в ваше приложение.

1
добавлено
Спасибо, но после нескольких часов пробуя много способов сделать загрузку, я обнаружил n многопользовательскую реализацию Ajax4J, которая включена в RichFaces ( org.ajax4jsf.request.MultipartRequest ), поэтому мне не нужно ее реализовывать сам :)
добавлено автор José Roberto Araújo Júnior, источник

Чтобы решить эту проблему с приемлемым решением, я создал обычную форму и сервлет, сервлет получает запрос multipart/form-data и использует org.ajax4jsf.request.MultipartRequest , включенный в RichFaces 3.3.3 для анализа полученных параметров и прикрепленного файла, затем я сохраняю экземпляр File в сеансе, и я его восстанавливаю в контексте JSF.

<Сильный> XHTML:


    
    

<form target="uploader" id="uploaderForm" action="#{request.contextPath}/MyServlet"
    method="post" enctype="multipart/form-data" style="position: absolute;margin: -210px 0 0 300px;">
    <div class="modulo-6-12">
        
<input type="file" id="uploadFileField" name="upload" onchange="jQuery('#uploaderForm').submit();" />
</div> </form> <iframe id="uploader" width="0" height="0" src="" style="display: none; border: 0; margin:0;padding:0;"></iframe>

Servlet:

public class MyServlet extends HttpServlet {

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String encoding = request.getCharacterEncoding();
        if(encoding == null) request.setCharacterEncoding("UTF-8");
        MultipartRequest mpRequest = new MultipartRequest(request,true,10*1024*1024,"importarXX");
        String field = "upload";
        Object o =mpRequest.getFile(field);
        if(o instanceof File)
        {
            File file = (File)o;
            HttpSession sess = request.getSession();
            String name = mpRequest.getFileName(field);

            Writer w = response.getWriter();
            w.write("<html><head><script>");
            if(!name.endsWith(".xls"))
            {

                w.write("parent.window.tipoNaoSuportado()" +
                        //"alert('Só são permitidos arquivos com extensão .xls');" +
                        "</script></head><body></body></html>");
                w.close();
                file.delete();
                return;
            }

            sess.setAttribute("importarXXFile", o);
            sess.setAttribute("importarXXFileName", name);
            w.write("parent.window.finishUpload();</script></head><body>Sucesso</body></html>");
            w.close();
        }
    }
}

Controller:

public boolean actionUploadArquivoDadosXX(){
    flgTipoNaoSuportado = false;
    HttpSession sess = ((HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest()).getSession();
    File uploadedFile = (File) sess.getAttribute("importarXXFile");
    String uploadedFileName = (String) sess.getAttribute("importarXXFileName");
    boolean ret = false;

    if(uploadedFile != null && uploadedFileName != null){
        BeanArquivoUpload arquivo = new BeanArquivoUpload();
        arquivo.setFile(uploadedFile);
        arquivo.setName(uploadedFileName);
        arquivo.setFileSize(uploadedFile.length());
        setArquivoConfig(arquivo);
        ret = true;
    }
    else
    {
         setArquivoConfig(null);
    }

    sess.removeAttribute("importarXXFile");
    sess.removeAttribute("importarXXFileName");

    return ret;


}
1
добавлено

Раньше я сталкивался с той же проблемой. Я решил проблему, открыв всплывающее окно, когда пользователь нажимает кнопку обзора, и это новое всплывающее окно напрямую связано с сервлетом, который поддерживает загрузку и загрузку файлов. После того, как файл был загружен, всплывающее окно было закрыто непосредственно сервлетом, вызывающим window.close() при загрузке тела сервлета. ниже приведены сделанные изменения:

В addItem.jsp, который запрашивает пользователя для файла:

<script type="text/javascript">
       ...
  function newWindow()
  {
    popupWindow = window.open('addItemImage.jsp','name','width=200,height=200');
  }
    ...
 </script>

     
         
          ...

           
                Item Image :
           
           
                <input type="button" value="Upload Image" onClick="newWindow()"/>
           

          ...
          
      

В открывшемся всплывающем окне: addItemImage.jsp

<script type="text/javascript">
    function validate()
    {
        var file = document.getElementById("file").value;
        if(file == null || file == "")
            return true;
        if(file.indexOf(".jpg") == -1 && file.indexOf(".gif")  && file.indexOf(".bmp") == -1 && file.indexOf(".jpeg") == -1) 
        {
            alert("Invalid File Format!! Please upload jpg/bmp/gif");
            return false;
        }
        return true;
    } 
</script>
<body>
    <form enctype="multipart/form-data" method="post" action="FileUploaderServler.view" onsubmit="return validate()">
        <input type="file" name="file" id="file" />
        <input type="submit" value="Upload Image">
    </form>
</body>

Это отправит на сервлет, который затем отобразит изображение и сохранит его в месте. FileUploaderServlet.java

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
    {
        List items = null;
        try 
        {
             MultipartHTTPServletRequest multipartHTTPServletRequest = new MultipartHTTPServletRequest(Connection.getRequest());
            items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(multipartHTTPServletRequest);
        } 
        catch (FileUploadException e) 
        {
            e.printStackTrace();
        }
        if(!Util.isNullList(items))
        {
            for (FileItem item : items) 
            {
                if (!item.isFormField()) 
                {
                    String itemName = item.getFieldName();
                    InputStream filecontent = null;

                    try 
                    {
                        filecontent = item.getInputStream();
                    } 
                    catch (IOException e) 
                    {
                        e.printStackTrace();
                    }

                   /* String currDirPath = System.getProperty("user.dir");//C:\Users\KISHORE\Desktop\eclipse
                    File file = new File(currDirPath+"\\itemImages");*/
                    new File(Constants.ABS_FILE_PATH_TO_IMAGES).mkdir();
                    File fw = new File(Constants.ABS_FILE_PATH_TO_IMAGES+"\\"+Connection.getRequest().getSession().getId()+".jpg");//E:\Kishore Shopping Cart\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\ShoppingCart\WEB-INF\itemImages\EC34EEE58065AD674192D3D57124F07E.jpg
                    fw.delete();
                    fw.createNewFile();
                    try 
                    {
                        item.write(fw);
                    } 
                    catch (Exception e) 
                    {
                        e.printStackTrace();
                    }
                }
            }

        }

        PrintWriter out = response.getWriter();
        out.print("<html><title>Add Image to Item</title><body onload='window.close()'>Uploaded Successfully!!</body>");
        System.out.print("</html>");
    }

Этот сервлет при завершении сохранения файла в сконфигурированном месте непосредственно закрывает всплывающее окно, которое было ранее открыто.

Таким образом, я смог использовать управляемый bean-компонент jsf 1.2 и добиться загрузки фила. Я нашел другие способы для stackoverflow, но чувствовал, что это было немного сложно реализовать.

0
добавлено
JavaScript Jobs — чат
JavaScript Jobs — чат
8 336 участник(ов)

JavaScript Jobs — чат для поиска работы и людей Правила оформления: https://teletype.in/@telegram-ru/r1WQe5F1m См. также: @mobile_jobs, @devops_jobs, @nodejs_jobs, @react_js, @angular_ru, @js_ru

JavaScript.ru
JavaScript.ru
7 932 участник(ов)

Сообщество сайта JavaScript.ru в Slack.

pro.js
pro.js
4 675 участник(ов)

Про JavaScript и NodeJS Invite: https://t.me/joinchat/Be4rsT5Rsgq30DHutjxXgA Правила: http://telegra.ph/ru-chat-rules-06-19 Вакансии только с ЗП, не чаще раза в неделю.

JavaScript — русскоговорящее сообщество
JavaScript — русскоговорящее сообщество
3 269 участник(ов)

Рекомендуем сразу отключить уведомления Правила: https://rudevs.network/ByaMH6un7 См. также: @js_noobs_ru, @nodejs_ru, @typescript_ru, @react_js, @electron_ru Вакансии и поиск работы: @javascript_jobs

JavaScript Noobs — сообщество новичков
JavaScript Noobs — сообщество новичков
2 484 участник(ов)

Чат для новичков

javascript_ru
javascript_ru
915 участник(ов)

Сообщество любителей самого популярного языка программирования в мире. Чат основан в 2009 году. Логи: https://goo.gl/9EOeM7 Поддержка бота: @chat_linker (ссылка на репу внутри) Вам будут интересны @frontend_ru и @css_ru

jsChat
jsChat
603 участник(ов)

Чат посвященный программированию на языке javaScript Перед отправкой ссылки на Ваш контент посоветуйтесь с админом Все ссылки удаляются ботом автоматически

JavaScript for Zombies Chat
JavaScript for Zombies Chat
492 участник(ов)

Чат про JavaScript для настоящих zombie! Вход строго по приглашениям! Ссылка для строгих приглашений: https://t.me/joinchat/AAMBHz3Uyr0tuZ7VaB029g

All That JS
All That JS
417 участник(ов)

JS на русском