【问题标题】:Uploading multiple files using jsp & servlets [duplicate]使用jsp和servlet上传多个文件[重复]
【发布时间】:2013-12-09 14:26:52
【问题描述】:

我目前正在开发一个动态 Web 应用程序,我希望用户能够一次上传多个文件以供应用程序使用。我不知道用户一次可以上传多少个文件;它可以是 2 个,也可以是 100 多个文件。我是 JSP 动态 Web 应用程序的新手,我从一个上传文件开始,但我不确定从这里去哪里。我查看了一些搜索示例,但我无法准确找到我正在寻找的内容。这是我目前所拥有的:

小服务程序:

package Servlets;
import java.io.File;  
import java.io.IOException;  
import java.io.PrintWriter;  
import java.util.Iterator;   
import java.util.List;  
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.FileItemFactory;  
import org.apache.commons.fileupload.FileUploadException;  
import org.apache.commons.fileupload.disk.DiskFileItemFactory;  
import org.apache.commons.fileupload.servlet.ServletFileUpload;  

public class UploadServlet extends HttpServlet 
{  

private static final long serialVersionUID = 1L;

    @Override  
      protected void doPost(HttpServletRequest request, HttpServletResponse response)  
          throws ServletException, IOException 
          {  
            boolean isMultipart = ServletFileUpload.isMultipartContent(request);  
            response.setContentType("text/html");  
            PrintWriter out = response.getWriter();  
            if (isMultipart) 
            {  
                // Create a factory for disk-based file items  
                FileItemFactory factory = new DiskFileItemFactory();  
                // Create a new file upload handler  
                ServletFileUpload upload = new ServletFileUpload(factory);  
                try 
                {  
                    // Parse the request  
                    List items = upload.parseRequest(request);  
                    Iterator iterator = items.iterator();  
                    while (iterator.hasNext()) 
                    {  
                        FileItem item = (FileItem) iterator.next();  
                        if (!item.isFormField())  
                        {  
                            String fileName = item.getName();      
                            String root = getServletContext().getRealPath("/");  
                            File path = new File(root + "/uploads");  
                            if (!path.exists())  
                            {  
                                boolean status = path.mkdirs();  
                            }  
                            File uploadedFile = new File(path + "/" + fileName);  
                            System.out.println(uploadedFile.getAbsolutePath());  
                        if(fileName!="")  
                            item.write(uploadedFile);  
                        else  
                        out.println("file not found");  
                        out.println("<h1>File Uploaded Successfully....:-)</h1>");  
                    }  
                    else  
                    {  
                        String abc = item.getString();  
                        out.println("<br><br><h1>"+abc+"</h1><br><br>");  
                    }  
                }  
            } 
            catch (FileUploadException e) 
            {  
            out.println(e);  
            } 
            catch (Exception e) 
            {  
            out.println(e);  
            }  
        }  
        else  
        {  
            out.println("Not Multipart");  
        }  
      }  
}

.JSP 文件:

<form method="post" action="UploadServlet" enctype="multipart/form-data">
Select file to upload:
    <p><input type="file" name="dataFile" id="fileChooser" />&nbsp;
    <input type="submit" value="Upload" multiple="multiple" /></p>
</form>

我正在寻找一种方法来上传多个文件,而不是只上传一个文件并将它们显示在列表中。

【问题讨论】:

标签: java jsp servlets file-upload


【解决方案1】:

查看 FileUPload Using Servlet 3.0

它有一个使用 Servlet3.0 上传单个文件的工作代码 正如你所看到的,代码现在大大简化了。并且不依赖apache库。

只需在下面使用index.html

<html>
<head></head>
<body>
<form action="FileUploadServlet" method="post" enctype="multipart/form-data">
Select File to Upload:<input type="file"  name="fileName" multiple/>
<br>
<input type="submit" value="Upload"/>
</form>
</body>
</html>

这里唯一的变化是我使用multiple 属性作为输入类型文件

【讨论】:

  • 在窗口弹出窗口中它不允许选择多个文件 - 即使按控制按钮或鼠标选择。
【解决方案2】:

哦...乍一看,似乎是一个简单的错误。 multiple 是文件输入的属性,不是提交按钮的属性。

【讨论】:

  • 我改了,但没有骰子。
  • 我似乎在重复同样的评论,但“没有骰子”绝对没有提供任何有用的反馈,说明具体出了什么问题,以及如何帮助你。 “按照建议,我更改了这样的代码: 但我仍然不能上传多个文件”很有用。或者“......但是现在即使我上传了更多文件,服务器端组件也只能找到其中一个。”很有用。在遇到紧急情况时,“没有骰子”的信息量与“医生,有什么好笑的”差不多。
  • @user3029610 更改您问题的代码。
【解决方案3】:

我已经使用 jsp /servlet 上传了多个文件。 以下是我使用的代码。

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

另一方面,服务器端。使用以下代码。

    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();
                } 
            }   
    }

}

【讨论】:

    【解决方案4】:

    images.jsp

    选择文件:

    storeimages.java servlet

    public class storeimages extends HttpServlet {
    
        @Override
        protected void doPost(HttpServletRequest request,
                HttpServletResponse response) throws ServletException,
                                                       IOException {
    
    String sav_dir=""; //this will be a folder inside
            //directory
            PrintWriter out =response.getWriter();
    
            //if you want u can give this at run time
             sav_dir="6022"; //in my case folder name is 6022 
             //you can alse set this at dynamic
    
            int flag = 0;
    
            //now set the path
            //this is the path where my images are stored
            //now u can see the code
     String savepath="K:/imageupload"+File.separator +sav_dir;   
    
     File file = new File(savepath);
    
     if(!file.exists()){
    
         file.mkdir();
     }
    
     String filename="";
    
     List<Part> fileParts = request.getParts().stream().
    filter(part->"file".equals(part.getName())).collect(Collectors.
            toList());
    
    for(Part filePart: fileParts){
        filename=Paths.get(filePart.getSubmittedFileName()).
        getFileName().toString();
    
        filePart.write(savepath+File.separator+filename);
        flag=1;
    
    
    }
             if(flag==1){
    
                 out.println("success");
             }
    
             else{
    
                 out.println("try again");
             }
    
         //now save this and run the project
        }
    }
    

    【讨论】:

      【解决方案5】:

      你只需要写multiple,因为multiple是一个布尔变量并且只定义它,它对你的标签是真实的。示例如下:

      <input type="file" name="file" id="file" multiple/> 
      

      这将让您一次选择多个文件。祝你好运

      【讨论】:

        【解决方案6】:

        我就是这样做的。它将动态添加和删除字段(多个文件)。验证它并在验证时调用操作方法,即 servlet 并存储在数据库中。 ** html/jsp ** .jsp 文件

        <div class="recent-work-pic">
        <form id="upload_form" method="post" action="uploadFile" enctype="multipart/form-data" >
        <input type="hidden" id="counter" value="1" >
        <a href="javascript:void(0);" class="remove_fields"  id="add_fields">Add</a>
        <div class="record"><input type="file" placeholder="Upload File" name="uploadFile_0" class="upload_input"></div>
        <div id="add_field_div"></div>
        <button type="submit" class="btn btn-read">Submit</button>
        </form>
        <p>${message}</p>
         </div>
        

        jQuery 验证

        <script>
        $(document).ready(function(){
            $('#add_fields').click( function(){
                add_inputs()
            });
        
            $(document).on('click', '.remove_fields', function() {
                $(this).closest('.record').remove();
            });
            function add_inputs(){
                var counter = parseInt($('#counter').val());
                var html = '<div class="record"><input type="file" placeholder="Upload File" name="uploadFile_' + counter + '" class="upload_input"><a href="javascript:void(0);" class="remove_fields">Remove</a></div>';
                $('#add_field_div').append(html);
                $('#counter').val( counter + 1 );
            }
            $('form#upload_form').on('submit', function(event) {
                //Add validation rule for dynamically generated name fields
            $('.upload_input').each(function() {
                $(this).rules("add", 
                    {
                        required: true,
                        messages: {
                            required: "File is required",
                        }
                    });
            });
        
        });
        $("#upload_form").validate();
        
        
        });
        </script>
        

        servlet

            protected void doPost(HttpServletRequest request, HttpServletResponse response)
                    throws ServletException, IOException {
        
        //      KeycloakPrincipal principal = (KeycloakPrincipal) request.getUserPrincipal();
        
        
                PrintWriter writer = response.getWriter();
                Properties properties = new Properties();
                properties.load(this.getClass().getClassLoader().getResourceAsStream("/resources/datenBank.properties"));
        
                if (!ServletFileUpload.isMultipartContent(request)) {
                    writer.println("Fehler: Form must has enctype=multipart/form-data.");
                    writer.flush();
                    return;
                }
                String message = null;
                InputStream inputStream = null;
                Connection dbConnection = null;
        
                String page = "";
                try {
                    for (Part filePart : request.getParts()) {
                        System.out.println("filePart" + filePart.getName() + "-----" + filePart.getSize());
                        if (filePart != null && filePart.getSize() != 0) {
                            inputStream = filePart.getInputStream();
        
                            System.out.println("inputStream" + inputStream);
                             HttpSession session=request.getSession();  
                             session.setAttribute("username",request.getRemoteUser());  
                            Class.forName(properties.getProperty("driverClassName"));
                            dbConnection = DriverManager.getConnection(properties.getProperty("url"), properties.getProperty("username"), properties.getProperty("password"));
                            if (dbConnection != null) {
        
                                    String sql = "INSERT INTO skl_lieferung (file_name, file_size, file_content,file_content_type, entry_time, user) values (?,?,?,?,?, ?)";
                                    PreparedStatement statement = dbConnection.prepareStatement(sql);
        
                                    if (inputStream != null) {
                                        statement.setString(1, getFileName(filePart));
                                        statement.setLong(2, filePart.getSize());
                                        statement.setBlob(3, inputStream);
                                        statement.setString(4, filePart.getContentType());
                                    }
        
                                    Calendar calendar = Calendar.getInstance();
                                    java.sql.Date entryDate = new java.sql.Date(calendar.getTime().getTime());
                                    statement.setDate(5, entryDate);
                                    statement.setString(6, request.getRemoteUser());
                                    //statement.setString(6, username);
        
                                    int row = statement.executeUpdate();
                                    if (row > 0) {
                                        message = "Datei hochgeladen und in der Datenbank gespeichert";
                                    }else {
                                        message = "Fehler: Connection Problem";
                                    }
                                }                   message = "Datei hochgeladen und in der Datenbank gespeichert";
        
                                }else {
                                    page = "index.jsp";
                                    System.out.println("cannot execute if condition");
                                    message = "Das Upload-Feld darf nicht leer sein ";
                                    RequestDispatcher dd = request.getRequestDispatcher(page);
                                    dd.forward(request, response);
                                    return;
                                }
                        } 
                    }catch (Exception exc) {
                    page = "index.jsp";
                    message = "Fehler: " + exc.getMessage();
                    exc.printStackTrace();
                } finally {
                    if (dbConnection != null) {
                        try {
                            dbConnection.close();
                        } catch (SQLException ex) {
                            ex.printStackTrace();
                        }
                        page = "index.jsp";
                        request.setAttribute("message", message);
                        RequestDispatcher dd = request.getRequestDispatcher(page);
                        dd.forward(request, response);
                    }
                }
            }
        
            private String getFileName(Part part) {
                for (String content : part.getHeader("content-disposition").split(";")) {
                    if (content.trim().startsWith("filename")) {
                        return content.substring(content.indexOf('=') + 1).trim().replace("\"", "");
                    }
                }
                return null;
            }
        

        我希望人们觉得它有用!!

        【讨论】:

          【解决方案7】:

          要上传单个文件,您应该使用属性 type="file" 的单个标签。要允许上传多个文件,请在 name 属性中包含多个具有不同值的输入标签。浏览器将 Browse 按钮​​与它们中的每一个关联起来。

          即多次使用以下行:

          <input type="file" name="dataFile" id="fileChooser" /><br><br>
          

          Refer this link for details

          我希望这会有所帮助。

          【讨论】:

            猜你喜欢
            • 2019-01-02
            • 2012-07-30
            • 2015-06-18
            • 2014-12-04
            • 2014-03-21
            • 1970-01-01
            • 1970-01-01
            • 2013-12-01
            • 2013-01-11
            相关资源
            最近更新 更多