2017-08-28 245 views
0

我正在使用下面的代碼將文件上傳到服務器。這是否合適?代碼中的路徑「d:/ new」是服務器路徑還是客戶端PC路徑。我必須在任何地方指定客戶端pc路徑。或者它會直接點擊瀏覽按鈕並選擇文件?除此之外,有沒有更好的方法將文件上傳到服務器?上傳文件(excel)到服務器

的index.html

<html> 
    <body> 
<form class="form-group" action="go" method="post" enctype="multipart/form-data"> 
              <% 

               Connection connection = null; 
               Statement statement = null; 
               String error = ""; 

               try { 
                Class.forName("com.mysql.jdbc.Driver").newInstance(); 
                connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/lms_data", "root", ""); 
                statement = connection.createStatement(); 
                ResultSet resultset = statement.executeQuery("select * from assessment_type"); 
                connection.setAutoCommit(false); 
              %> 


              <label>Assessment Type</label> 
              <select class="form-control" name="assessment_type_id"> 
               <% while (resultset.next()) {%> 
               <option value="<%= resultset.getString(1)%>"><%= resultset.getString(2)%></option> 

               <% } %> 
              </select> 

              <% 
              ResultSet resultset_cat_id = statement.executeQuery("select * from course_category"); 
              %> 
              <br/><label>Category Name</label> 
              <select class="form-control" name="category_id"> 
               <% while (resultset_cat_id.next()) {%> 
               <option value="<%= resultset_cat_id.getString(1)%>"><%= resultset_cat_id.getString(2)%></option> 

               <% } %> 
              </select> 
              <% 
               } catch (Exception e) { 
                if (!connection.isClosed()) { 
                 connection.close(); 
                } 
                out.println(e); 
                e.printStackTrace(); 
               } 
              %> 
              <label class="control-label">Select File</label> 
              <input type="file" name="file" id="file"><br/> 


              <input type="submit" name="submitform" class="btn btn-primary" value="Submit" style="width:20%;border-radius:0px;"><br/><br/> 



             </form> 
    </body> 
    </html> 

UploadServlet.java

import java.io.*; 
import javax.servlet.ServletException; 
import javax.servlet.http.*; 
import com.oreilly.servlet.MultipartRequest; 

public class UploadServlet extends HttpServlet { 

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

response.setContentType("text/html"); 
PrintWriter out = response.getWriter(); 

MultipartRequest m=new MultipartRequest(request,"d:/new"); 
out.print("successfully uploaded"); 
} 
} 

的web.xml

<web-app> 

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

<servlet-mapping> 
<servlet-name>UploadServlet</servlet-name> 
<url-pattern>/go</url-pattern> 
</servlet-mapping> 

</web-app> 
+0

請注意下次如何粘貼您的代碼。應該很容易閱讀(不是一個代碼塊中的多個文件),而應該正確格式化它。我做了一個快速的改進,因爲你是新的:)(我不能格式化代碼atm,讓別人去做)。 – CodeShark

回答

0

由於您使用的multipart/FORMDATA,試試這一段代碼在虎視眈眈文件並將其寫入您定義的文件夾中的項目。
在您的項目中創建一個文件夾(例如:document/excel /)。

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

    String fileName = ""; 

    if (!ServletFileUpload.isMultipartContent((HttpServletRequest) request)) { 
     PrintWriter writer = response.getWriter(); 
     writer.println("Error: Form must has enctype=multipart/form-data."); 
     writer.flush(); 
     return; 
    } 
    DiskFileItemFactory factory = new DiskFileItemFactory(); 
    factory.setSizeThreshold(3145728); 
    factory.setRepository(new File(System.getProperty("java.io.tmpdir"))); 
    ServletFileUpload upload = new ServletFileUpload((FileItemFactory) factory); 
    upload.setFileSizeMax(41943040); 
    upload.setSizeMax(52428800); 
    String uploadPath = String.valueOf(this.getServletContext().getRealPath("")) + File.separator + "foldername"; // example : (documents/excel/) 
    File uploadDir = new File(uploadPath); 
    if (!uploadDir.exists()) { 
     uploadDir.mkdir(); 
    } 
    try { 

     List<FileItem> formItems = upload.parseRequest(request); 
     if (formItems != null && formItems.size() > 0) { 
      for (FileItem item : formItems) { 
      if (item.isFormField()) 
        { 

        if ("assessment_type_id".equals(item.getFieldName())) 
        assessment= item.getString(); 
        else if ("category_id".equals(item.getFieldName())) 
        categoryid= Integer.parseInt(item.getString()); 


        } 
       else { 
        fileName = new File(item.getName()).getName(); 
        String ext1 = FilenameUtils.getExtension(fileName); 
        fileName = fileName+ "." + ext1; 
        String filePath = String.valueOf(uploadPath) + File.separator + fileName; 
        File storeFile = new File(filePath); 
        item.write(storeFile); 
        request.setAttribute("message", "File Uploaded Successfully"); 

       } 
// then Here update the Database 

      } 

     } 
    } catch (Exception ex) { 
     request.setAttribute("message", (Object) ("There was an error: " + ex.getMessage())); 

    } 
} 

Uploadpath變種會帶你到你的項目的位置,那麼你檢查是否有張貼某種形式的項目,最後將文件寫入到該位置。
希望這個作品!

+0

是否可以在jsp文件中使用此代碼而不是java類? – ViRaPa

+0

是的,但它更好地創建一個Servlet類,它有兩個預定義的方法在它, 1 doGet() 2 doPost() 使用我的代碼在後期的方法,並將HTML表單操作設置爲「發佈」 –

+0

代碼工作正常。但在表單中,我有一些代碼要在文件上傳後執行。怎麼做。如何回到jsp的形式,以及如何在文件上傳後執行該代碼? – ViRaPa