Hi Friends.hope you all are fine .today I am going to demonstrate how to upload multiple file using AngularJS framework. Dependancy of Angularjs can be downloaded from https://angularjs.org/.
I suggest you to use https://jsfiddle.net to get practical examples of each & every concept of Angularjs .some of the concepts like ng-app,ng-controller,ng-model,ng-binding,routing,client side interceptor etc.
Technology Stack being used:
1) JDK 1.7
2) Spring 3.x
3) Hibernate 3.x
4) Angularjs
5) BootStrap CDN
(6) Tomcat 7.0
Project Structure is as given below :
Let's Move to code :
Hibernate Model entity class is given below :
Controller is as given below :
DAO(Data Access Layer) : for database Interaction
Service Implementation is as given below :
Property files are as given below:
applicationcontext-servlet.xml
Deployment Descriptor - web.xml
JSP for uploading file is as given below :
success file for upload is as given below:
screen will look like given below:
I suggest you to use https://jsfiddle.net to get practical examples of each & every concept of Angularjs .some of the concepts like ng-app,ng-controller,ng-model,ng-binding,routing,client side interceptor etc.
Technology Stack being used:
1) JDK 1.7
2) Spring 3.x
3) Hibernate 3.x
4) Angularjs
5) BootStrap CDN
(6) Tomcat 7.0
Project Structure is as given below :
Let's Move to code :
Hibernate Model entity class is given below :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | package org.fileupload.model; import java.util.List; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; import javax.persistence.Transient; import org.springframework.web.multipart.MultipartFile; @Entity @Table(name="trnimage") public class FileUpload { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "ID", unique = true, nullable = false) private int ID; @Column(name = "DATA", unique = false, nullable = false, length = 100000) private byte[] data; @Column(name = "IMAGE_NAME", unique = false, nullable = false, length = 100) private String IMAGE_NAME; @Transient public int getID() { return ID; } public void setID(int iD) { ID = iD; } public byte[] getData() { return data; } public void setData(byte[] data) { this.data = data; } public String getIMAGE_NAME() { return IMAGE_NAME; } public void setIMAGE_NAME(String iMAGE_NAME) { IMAGE_NAME = iMAGE_NAME; } @Transient private List<MultipartFile> file; public List<MultipartFile> getFile() { return file; } public void setFile(List<MultipartFile> file) { this.file = file; } } |
Controller is as given below :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 | package org.fileupload.controller; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.ResourceBundle; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.log4j.Logger; import org.fileupload.dao.fileUploadDaoImpl; import org.fileupload.model.FileUpload; import org.fileupload.model.FileuploadVO; import org.fileupload.service.fileUploadServiceImpl; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.util.FileCopyUtils; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.context.support.WebApplicationContextUtils; import org.springframework.web.multipart.MultipartFile; @Controller public class FileUploadController { private Logger logger = Logger.getLogger(FileUploadController.class); // public FileUploadController() { logger.info("File Upload Controller Called : -"); } //angular js call @RequestMapping(value = "/Testupload.htm", method = RequestMethod.POST) public String SaveTestImage( @ModelAttribute("uploadForm") FileUpload uploadForm, Model map,HttpServletRequest request ) throws IllegalStateException, IOException { logger.info(" Upload method Called : -"); System.out.println(request.getParameter("filename")); WebApplicationContext context =WebApplicationContextUtils.getWebApplicationContext(request.getSession().getServletContext()); fileUploadServiceImpl service=(fileUploadServiceImpl) context.getBean("fileuploadService"); fileUploadDaoImpl dao=(fileUploadDaoImpl) context.getBean("fileuploadDAO"); //ResourceBundle rs =ResourceBundle.getBundle("test.properties"); ResourceBundle rb = ResourceBundle.getBundle("resources/filePath"); String saveDirectory = rb.getString("file.fileUploadPath"); List<MultipartFile> listFiles = uploadForm.getFile(); List<String> fileNames = new ArrayList<String>(); int id =0; if (null != listFiles && listFiles.size() > 0) { for (MultipartFile multipartFile : listFiles) { String fileName = multipartFile.getOriginalFilename(); if (!"".equalsIgnoreCase(fileName)) { // Handle file content - multipartFile.getInputStream() multipartFile .transferTo(new File(saveDirectory + fileName)); fileNames.add(fileName); uploadForm.setData(fileName.getBytes()); uploadForm.setIMAGE_NAME(fileName); id= service.SaveTestImage(uploadForm); } } } map.addAttribute("files", fileNames); map.addAttribute("ids", id+""); return "uploadfilesuccess"; } @RequestMapping(value = "/download.htm", method = RequestMethod.GET) public String download( @RequestParam("id") String id, Model map,HttpServletRequest request,HttpServletResponse response) throws IllegalStateException, IOException { System.out.println("id is : "+id); WebApplicationContext context =WebApplicationContextUtils.getWebApplicationContext(request.getSession().getServletContext()); fileUploadServiceImpl service=(fileUploadServiceImpl) context.getBean("fileuploadService"); FileuploadVO f = service.downloadImg(id); response.setContentLength(f.getData().length); response.setHeader("Content-Disposition","attachment; filename=\"" + f.getIMAGE_NAME() +"\""); FileCopyUtils.copy(f.getData(), response.getOutputStream()); return null; } /*@RequestMapping(value = "/test.htm") public String test() throws IOException { //just throw exception to test the exceptionhandler mapping if(true) { throw new IOException("this is io exception"); } // render index.jsp page return "index"; }*/ } |
DAO(Data Access Layer) : for database Interaction
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | package org.fileupload.dao; import org.fileupload.model.FileuploadVO; public interface fileUploadDao { public int saveImage(FileuploadVO fileupload); public FileuploadVO downloadImg(String id); int saveImage1(FileuploadVO fileupload); } Service is as DAO Implementation is as given below : package org.fileupload.dao; import org.fileupload.model.FileUpload; import org.fileupload.model.FileuploadVO; import org.springframework.orm.hibernate3.HibernateTemplate; public class fileUploadDaoImpl implements fileUploadDao{ private HibernateTemplate template; //@Autowired //private JdbcTemplate jdbcTemplate; public fileUploadDaoImpl(HibernateTemplate template ) { this.template = template; //template.getSessionFactory().openSession().load("", ""); } @Override public int saveImage1(FileuploadVO fileupload) { template.save(fileupload); return fileupload.getID(); } public FileuploadVO downloadImg(String id) { // String query = "select * from trnimage where ID = ?"; FileuploadVO file = (FileuploadVO) template.getSessionFactory().openSession().load(FileuploadVO.class, new Integer(id)); return file; } @Override public int saveImage(FileuploadVO fileupload) { // TODO Auto-generated method stub return 0; } public int SaveTestImage(FileUpload fileupload) { template.save(fileupload); return fileupload.getID(); } } |
Service Implementation is as given below :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | public class fileUploadServiceImpl implements fiileUploadService{ @Autowired private fileUploadDaoImpl fileuploadDAO; @Override public int saveImage(FileuploadVO fileupload) { // TODO Auto-generated method stub return fileuploadDAO.saveImage(fileupload); } @Override public FileuploadVO downloadImg(String id) { // TODO Auto-generated method stub return fileuploadDAO.downloadImg(id); } @Override public int SaveTestImage(FileUpload fileupload) { // TODO Auto-generated method stub return fileuploadDAO.SaveTestImage(fileupload); } } |
Property files are as given below:
1 2 3 4 5 6 7 8 9 | dbConfig.properties jdbc.driverClassName = com.mysql.jdbc.Driver jdbc.url = jdbc:mysql://localhost:3306/studentdb jdbc.username = root jdbc.password = admin!@# filePath.properties file.fileUploadPath = D:/NisargPics/ file.filedownloadPath = D:/NisargPics/download |
applicationcontext-servlet.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <context:annotation-config></context:annotation-config> <mvc:annotation-driven></mvc:annotation-driven> <context:component-scan base-package="org.fileupload.controller"></context:component-scan> <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location"><value>classpath:resources/dbConfig.properties</value> </property> </bean> <!-- Hibernate Configuration --> <bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${jdbc.driverClassName}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </bean> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="myDataSource"></property> </bean> <bean id="mySessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="dataSource" ref="myDataSource" /> <property name="annotatedClasses"> <list> <value>org.fileupload.model.FileuploadVO</value> <value>org.fileupload.model.FileUpload</value> </list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect"> org.hibernate.dialect.MySQLDialect</prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.dbcp.initialSize">8</prop> <prop key="hibernate.dbcp.maxActive">20</prop> <prop key="hibernate.dbcp.maxIdle">20</prop> <prop key="hibernate.dbcp.minIdle">0</prop> <prop key="hibernate.hbm2ddl.auto">none</prop> </props> </property> </bean> <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate"> <constructor-arg ref="mySessionFactory" /> </bean> <!-- list of bean definations --> <bean id="fileuploadDAO" class="org.fileupload.dao.fileUploadDaoImpl"> <constructor-arg ref="hibernateTemplate" /> <!-- <constructor-arg index ="1" ref="jdbcTemplate" ></constructor-arg> --> </bean> <bean id="fileuploadService" class="org.fileupload.service.fileUploadServiceImpl"> </bean> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="cacheSeconds" value="0" /> </bean> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" /> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize" value="5242880" /> </bean> </beans> |
Deployment Descriptor - web.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name></display-name> <welcome-file-list> <welcome-file>FileUpload.jsp</welcome-file> </welcome-file-list> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationcontext-servlet.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> </listener> <servlet> <servlet-name>applicationcontext</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>applicationcontext</servlet-name> <url-pattern>*.htm</url-pattern> </servlet-mapping> </web-app> |
JSP for uploading file is as given below :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | <!DOCTYPE html> <html> <head> <title>File Upload Example using AngularJS</title> <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script> <script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.min.js"></script> </head> <script type="text/javascript"> var myApp = angular.module('uploadApp', []); myApp.controller('uploadController', function ($scope) { // GET THE FILE INFORMATION. $scope.getFileDetails = function (e) { $scope.files = []; $scope.$apply(function () { // STORE THE FILE OBJECT IN AN ARRAY. for (var i = 0; i < e.files.length; i++) { $scope.files.push(e.files[i]); } }); }; // NOW UPLOAD THE FILES. $scope.uploadFiles = function () { //FILL FormData WITH FILE DETAILS. var data = new FormData(); for (var i in $scope.files) { data.append("file", $scope.files[i]); console.log($scope.files[i]); } // ADD LISTENERS. var objXhr = new XMLHttpRequest(); objXhr.addEventListener("progress", updateProgress, false); objXhr.addEventListener("load", transferComplete, false); // SEND FILE DETAILS TO tHE API. objXhr.open("POST", "/SpringFileUpload_Download/Testupload.htm"); objXhr.send(data); } // UPDATE PROGRESS BAR. function updateProgress(e) { if (e.lengthComputable) { document.getElementById('pro').setAttribute('value', e.loaded); document.getElementById('pro').setAttribute('max', e.total); } } // CONFIRMATION. function transferComplete(e) { alert("Files uploaded successfully."); } }); </script> <body ng-app="uploadApp"> <div ng-controller="uploadController" > <p><progress id="pro" value="0"></progress></p> <div class="form-group form-horizontal"> <input type="file" id="file" name="file" multiple onchange="angular.element(this).scope().getFileDetails(this)" class="input-file"/> </div> <div class="col-md-4"> <input type="button" ng-click="uploadFiles()" value="Upload" class="btn btn-primary"/> </div> </div> </body> |
success file for upload is as given below:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> </head> <body> <p>Awesome.. Following file is uploaded successfully.</p> <table width="80%" border="1" cellspacing="0" cellpadding="5"> <tr> <th width="4%">No</th> <th width="30%">Filename</th> <th width="20%"> </th> </tr> <c:choose> <c:when test="${files != null}"> <c:forEach var="file" items="${files}" varStatus="counter"> <tr> <td>${counter.index + 1}</td> <td>${file}</td> <td><div align="center"><a href="download.htm?id=${ids}">Download</a> </div></td> </tr> </c:forEach> </c:when> </c:choose> </table> </body> </html> |
screen will look like given below:
Thanks for reading this article
for any query ping me on npjava90@gmail.com