使用swfUpload進行批量上傳圖片
阿新 • • 發佈:2019-01-10
uploadInput頁面:
<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>上傳照片</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> <link href="swfupload/default.css" rel="stylesheet" type="text/css" /> <script type="text/javascript" src="/tiantian/swfupload/swfupload.js"></script> <script type="text/javascript" src="/tiantian/swfupload/handlers.js"></script> <script type="text/javascript"> var swfu; window.onload = function () { swfu = new SWFUpload({ // Backend Settings upload_url: "/tiantian/picture/upload",//上傳到哪個地址 post_params: {"albumId": "${album.id}"},//傳過去的引數 // File Upload Settings file_size_limit : "20 MB", // 2MB file_types : "*.jpg;*.jpeg;*.gif", file_types_description : "JPG Images", file_upload_limit : 0, // Event Handler Settings - these functions as defined in Handlers.js // The handlers are not part of SWFUpload but are part of my website and control how // my website reacts to the SWFUpload events. swfupload_preload_handler : preLoad, swfupload_load_failed_handler : loadFailed, file_queue_error_handler : fileQueueError, file_dialog_complete_handler : fileDialogComplete, upload_progress_handler : uploadProgress, upload_error_handler : uploadError, upload_success_handler : uploadSuccess, upload_complete_handler : uploadComplete, // Button Settings button_image_url : "/tiantian/images/swfupload/SmallSpyGlassWithTransperancy_17x18.png", button_placeholder_id : "spanButtonPlaceholder", button_width: 180, button_height: 18, button_text : '<span class="button">Select Images <span class="buttonSmall">(2 MB Max)</span></span>', button_text_style : '.button { font-family: Helvetica, Arial, sans-serif; font-size: 12pt; } .buttonSmall { font-size: 10pt; }', button_text_top_padding: 0, button_text_left_padding: 18, button_window_mode: SWFUpload.WINDOW_MODE.TRANSPARENT, button_cursor: SWFUpload.CURSOR.HAND, // Flash Settings flash_url : "/tiantian/swfupload/swfupload.swf", flash9_url : "/tiantian/swfupload/swfupload_fp9.swf", custom_settings : { upload_target : "divFileProgressContainer" }, //Image Resize:no, // Debug Settings debug: false }); }; </script> <style type="text/css"> #tophead { text-align:left; padding-left:10px; margin-top:10px; } </style> </head> <body> <div id="tophead"> <a href="picture/index">返回相簿首頁</a> </div> <div id="content" style="text-align: left"> <h2>${album.name}</h2> <p>upload Images to ${album.name}</p> <form> <div style="width: 180px; height: 18px; border: solid 1px #7FAAFF; background-color: #C5D9FF; padding: 2px;"> <span id="spanButtonPlaceholder"></span> </div> </form> <div id="divFileProgressContainer" style="height: 75px;"></div> <div id="thumbnails"></div> </div> </body> </html>
上傳頁面用到的handler.js檔案的內容:
function preLoad() { if (!this.support.loading) { alert("You need the Flash Player 9.028 or above to use SWFUpload."); return false; } } function loadFailed() { alert("Something went wrong while loading SWFUpload. If this were a real application we'd clean up and then give you an alternative"); } function fileQueueError(file, errorCode, message) { try { var imageName = "error.gif"; var errorName = ""; if (errorCode === SWFUpload.errorCode_QUEUE_LIMIT_EXCEEDED) { errorName = "You have attempted to queue too many files."; } if (errorName !== "") { alert(errorName); return; } switch (errorCode) { case SWFUpload.QUEUE_ERROR.ZERO_BYTE_FILE: imageName = "zerobyte.gif"; break; case SWFUpload.QUEUE_ERROR.FILE_EXCEEDS_SIZE_LIMIT: imageName = "toobig.gif"; break; case SWFUpload.QUEUE_ERROR.ZERO_BYTE_FILE: case SWFUpload.QUEUE_ERROR.INVALID_FILETYPE: default: alert(message); break; } addImage("images/" + imageName); } catch (ex) { this.debug(ex); } } function fileDialogComplete(numFilesSelected, numFilesQueued) { try { if (numFilesQueued > 0) { this.startResizedUpload(this.getFile(0).ID, 100, 100, SWFUpload.RESIZE_ENCODING.JPEG, 100); } } catch (ex) { this.debug(ex); } } function uploadProgress(file, bytesLoaded) { try { var percent = Math.ceil((bytesLoaded / file.size) * 100); var progress = new FileProgress(file, this.customSettings.upload_target); progress.setProgress(percent); progress.setStatus("Uploading..."); progress.toggleCancel(true, this); } catch (ex) { this.debug(ex); } } function uploadSuccess(file, serverData) { try { var progress = new FileProgress(file, this.customSettings.upload_target); if (serverData.substring(0, 7) === "FILEID:") { //把上傳的照片的縮圖在頁面上進行顯示 addImage("picture/thumbnail/" + serverData.substring(7)); // alert(serverData.substring(7)+"hello"); progress.setStatus("Upload Complete."); progress.toggleCancel(false); } else { addImage("images/swfupload/error.gif"); progress.setStatus("Error."); progress.toggleCancel(false); alert(serverData); } } catch (ex) { this.debug(ex); } } function uploadComplete(file) { try { /* I want the next upload to continue automatically so I'll call startUpload here */ if (this.getStats().files_queued > 0) { this.startResizedUpload(this.getFile(0).ID, 500, 500, SWFUpload.RESIZE_ENCODING.JPEG, 500); } else { var progress = new FileProgress(file, this.customSettings.upload_target); progress.setComplete(); progress.setStatus("All images received."); progress.toggleCancel(false); } } catch (ex) { this.debug(ex); } } function uploadError(file, errorCode, message) { var imageName = "error.gif"; var progress; try { switch (errorCode) { case SWFUpload.UPLOAD_ERROR.FILE_CANCELLED: try { progress = new FileProgress(file, this.customSettings.upload_target); progress.setCancelled(); progress.setStatus("Cancelled"); progress.toggleCancel(false); } catch (ex1) { this.debug(ex1); } break; case SWFUpload.UPLOAD_ERROR.UPLOAD_STOPPED: try { progress = new FileProgress(file, this.customSettings.upload_target); progress.setCancelled(); progress.setStatus("Stopped"); progress.toggleCancel(true); } catch (ex2) { this.debug(ex2); } case SWFUpload.UPLOAD_ERROR.UPLOAD_LIMIT_EXCEEDED: imageName = "uploadlimit.gif"; break; default: alert(message); break; } addImage("images/" + imageName); } catch (ex3) { this.debug(ex3); } } function addImage(src) { var newImg = document.createElement("img"); newImg.style.margin = "5px"; document.getElementById("thumbnails").appendChild(newImg); if (newImg.filters) { try { newImg.filters.item("DXImageTransform.Microsoft.Alpha").opacity = 0; } catch (e) { // If it is not set initially, the browser will throw an error. This will set it if it is not set yet. newImg.style.filter = 'progid:DXImageTransform.Microsoft.Alpha(opacity=' + 0 + ')'; } } else { newImg.style.opacity = 0; } newImg.onload = function () { fadeIn(newImg, 0); }; newImg.src = src; } function fadeIn(element, opacity) { var reduceOpacityBy = 5; var rate = 30; // 15 fps if (opacity < 100) { opacity += reduceOpacityBy; if (opacity > 100) { opacity = 100; } if (element.filters) { try { element.filters.item("DXImageTransform.Microsoft.Alpha").opacity = opacity; } catch (e) { // If it is not set initially, the browser will throw an error. This will set it if it is not set yet. element.style.filter = 'progid:DXImageTransform.Microsoft.Alpha(opacity=' + opacity + ')'; } } else { element.style.opacity = opacity / 100; } } if (opacity < 100) { setTimeout(function () { fadeIn(element, opacity); }, rate); } } /* ****************************************** * FileProgress Object * Control object for displaying file info * ****************************************** */ function FileProgress(file, targetID) { this.fileProgressID = "divFileProgress"; this.fileProgressWrapper = document.getElementById(this.fileProgressID); if (!this.fileProgressWrapper) { this.fileProgressWrapper = document.createElement("div"); this.fileProgressWrapper.className = "progressWrapper"; this.fileProgressWrapper.id = this.fileProgressID; this.fileProgressElement = document.createElement("div"); this.fileProgressElement.className = "progressContainer"; var progressCancel = document.createElement("a"); progressCancel.className = "progressCancel"; progressCancel.href = "#"; progressCancel.style.visibility = "hidden"; progressCancel.appendChild(document.createTextNode(" ")); var progressText = document.createElement("div"); progressText.className = "progressName"; progressText.appendChild(document.createTextNode(file.name)); var progressBar = document.createElement("div"); progressBar.className = "progressBarInProgress"; var progressStatus = document.createElement("div"); progressStatus.className = "progressBarStatus"; progressStatus.innerHTML = " "; this.fileProgressElement.appendChild(progressCancel); this.fileProgressElement.appendChild(progressText); this.fileProgressElement.appendChild(progressStatus); this.fileProgressElement.appendChild(progressBar); this.fileProgressWrapper.appendChild(this.fileProgressElement); document.getElementById(targetID).appendChild(this.fileProgressWrapper); fadeIn(this.fileProgressWrapper, 0); } else { this.fileProgressElement = this.fileProgressWrapper.firstChild; this.fileProgressElement.childNodes[1].firstChild.nodeValue = file.name; } this.height = this.fileProgressWrapper.offsetHeight; } FileProgress.prototype.setProgress = function (percentage) { this.fileProgressElement.className = "progressContainer green"; this.fileProgressElement.childNodes[3].className = "progressBarInProgress"; this.fileProgressElement.childNodes[3].style.width = percentage + "%"; }; FileProgress.prototype.setComplete = function () { this.fileProgressElement.className = "progressContainer blue"; this.fileProgressElement.childNodes[3].className = "progressBarComplete"; this.fileProgressElement.childNodes[3].style.width = ""; }; FileProgress.prototype.setError = function () { this.fileProgressElement.className = "progressContainer red"; this.fileProgressElement.childNodes[3].className = "progressBarError"; this.fileProgressElement.childNodes[3].style.width = ""; }; FileProgress.prototype.setCancelled = function () { this.fileProgressElement.className = "progressContainer"; this.fileProgressElement.childNodes[3].className = "progressBarError"; this.fileProgressElement.childNodes[3].style.width = ""; }; FileProgress.prototype.setStatus = function (status) { this.fileProgressElement.childNodes[2].innerHTML = status; }; FileProgress.prototype.toggleCancel = function (show, swfuploadInstance) { this.fileProgressElement.childNodes[0].style.visibility = show ? "visible" : "hidden"; if (swfuploadInstance) { var fileID = this.fileProgressID; this.fileProgressElement.childNodes[0].onclick = function () { swfuploadInstance.cancelUpload(fileID); return false; }; } };
後臺進行處理的struts2 Action程式碼:
import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.OutputStream; import java.io.PrintWriter; import java.util.Date; import java.util.List; import java.util.Map; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import org.apache.struts2.ServletActionContext; import org.apache.struts2.interceptor.RequestAware; import org.apache.struts2.interceptor.SessionAware; import com.opensymphony.xwork2.ActionSupport; import com.tiantian.tiantian.model.Album; import com.tiantian.tiantian.model.Picture; import com.tiantian.tiantian.model.User; import com.tiantian.tiantian.service.AlbumService; import com.tiantian.tiantian.service.PictureService; import com.tiantian.tiantian.util.ImageSizer; import com.tiantian.tiantian.util.Pager; import com.tiantian.tiantian.util.Util; public class PictureAction extends ActionSupport implements RequestAware,SessionAware { /** * */ private static final long serialVersionUID = 375280356930857300L; private PictureService pictureService; private AlbumService albumService; private int offset; private int maxResults = 20; private int totalRecords; private int totalPage; private Pager<Picture> pager; private Map<String, Object> request; private Map<String, Object> session; private List<Picture> pictures; private List<Album> albums; private int albumId; private Album album; //upload private File Filedata;//swfupload上傳檔案的預設名稱 private String FiledataFileName; private String FiledataContentType; private String albumName; private int id; private Picture pic; private String username; public String execute() { User currentUser = (User)session.get("user"); ifFirstIn(currentUser);//如果使用者是第一次訪問,則給ta新增一個預設的相簿 if (Util.isNull(username)) username = currentUser.getUsername(); albums = albumService.find(username); return SUCCESS; } private void ifFirstIn(User currentUser) { int size = albumService.find(currentUser.getUsername()).size(); if (size == 0) { Album album = new Album(); album.setOwner(currentUser); album.setName("我的相簿"); albumService.add(album); } } public String myPictures() { if (albumId > 0) { album = albumService.findById(albumId); Object obj = request.get("pager.offset"); if (obj != null) offset = (Integer)obj; pager = pictureService.find(offset, maxResults, albumId); pictures = pager.getData(); totalRecords = pager.getTotalCount(); } return "myPictures"; } public String detail() { if (id > 0) { pic = pictureService.find(id); if (pic != null) pictures = pictureService.findAll(pic.getAlbum().getId()); } return "detail"; } public String uploadInput() { if (albumId > 0) album = albumService.findById(albumId); return "uploadInput"; } public void upload() throws IOException { // System.out.println("albumId = "+albumId); if (albumId > 0) { if (Filedata != null) { User currentUser = (User)session.get("user"); Album album = albumService.findById(albumId); String path = ServletActionContext.getServletContext().getRealPath("/images/pics/"+currentUser.getUsername()+"/"+album.getId()); File dir = new File(path); if (!dir.exists()) dir.mkdirs(); String fileName = geneFileName(FiledataFileName); File dest = new File(dir,fileName); Util.upload(Filedata, dest); String picName = FiledataFileName.substring(0,FiledataFileName.lastIndexOf(".")); boolean flag = album.getPictures().size()==0; Picture pic = new Picture(); pic.setUrl(fileName); pic.setName(picName); pic.setAlbum(album); pictureService.add(pic); album.getPictures().add(pic); int id = pic.getId(); if (flag) { int index = FiledataFileName.lastIndexOf("."); String extension = FiledataFileName.substring(index+1); String faceFileName = geneFileName(FiledataFileName); String faceUrl = currentUser.getUsername()+"/"+album.getId()+"/"+geneFileName(FiledataFileName); File dest1 = new File(dir,faceFileName); ImageSizer.resize(Filedata, dest1, 200, extension); album.setFaceUrl(faceUrl); } albumService.update(album); HttpServletResponse response = ServletActionContext.getResponse(); response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); out.print("FILEID:"+id); } } } private String geneFileName(String fileName) { int index = fileName.lastIndexOf("."); String extension = fileName.substring(index); String prefix = Util.formatDate(new Date(), "yyyyMMddHHmmss"); String name = prefix + extension; return name; } public void addAlbum() throws IOException { HttpServletResponse response = ServletActionContext.getResponse(); response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); String outStr = "ok"; if (!Util.isNull(albumName)) { User owner = (User)session.get("user"); Album album = new Album(); album.setName(albumName); album.setOwner(owner); albumService.add(album); } else outStr = "操作失敗!相簿名稱不能為空!"; out.write(outStr); out.flush(); out.close(); } public void delAlbum() throws IOException { HttpServletResponse response = ServletActionContext.getResponse(); response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); String outStr = "ok"; if (albumId > 0) { album = albumService.findById(albumId); albumService.del(albumId); String path = ServletActionContext.getServletContext().getRealPath("/images/pics")+"/"+album.getOwner().getUsername()+"/"+album.getId(); File dest = new File(path); if (dest.exists()) delDerectory(dest); } else { outStr = "操作錯誤,刪除失敗!"; } out.write(outStr); out.flush(); out.close(); } private void delDerectory(File dir) { File[] files = dir.listFiles(); for (File file:files) { file.delete(); } dir.delete(); } public String thumbnail() throws IOException { if (id > 0) { pic = pictureService.find(id); String path = ServletActionContext.getServletContext().getRealPath("/images/pics")+"/"+pic.getAlbum().getOwner().getUsername()+"/"+pic.getAlbum().getId()+"/"+pic.getUrl(); FileInputStream fis = new FileInputStream(path); int len = fis.available(); byte bytes[] = new byte[len]; fis.read(bytes); fis.close(); HttpServletResponse response = ServletActionContext.getResponse(); response.setContentType("image/jpeg"); OutputStream os = response.getOutputStream(); os.write(bytes); os.flush(); os.close(); } return NONE; } public void del() throws IOException { HttpServletResponse response = ServletActionContext.getResponse(); response.setContentType("text/html"); PrintWriter out = response.getWriter(); String outStr = "ok"; if (id > 0) { Picture pic = pictureService.find(id); if (pic != null) { // pic.setAlbum(null); // pictureService.update(pic); pictureService.del(id); String path = ServletActionContext.getServletContext().getRealPath("/images/pics")+"/"+pic.getAlbum().getOwner().getUsername()+"/"+pic.getAlbum().getId()+"/"+pic.getUrl(); File dest = new File(path); if (dest.exists()) dest.delete(); } } else outStr = "操作錯誤,請求的內容不存在!"; out.write(outStr); out.flush(); out.close(); } public PictureService getPictureService() { return pictureService; } @Resource public void setPictureService(PictureService pictureService) { this.pictureService = pictureService; } public int getOffset() { return offset; } public void setOffset(int offset) { this.offset = offset; } public int getMaxResults() { return maxResults; } public void setMaxResults(int maxResults) { this.maxResults = maxResults; } public int getTotalRecords() { return totalRecords; } public void setTotalRecords(int totalRecords) { this.totalRecords = totalRecords; } public int getTotalPage() { return totalPage; } public void setTotalPage(int totalPage) { this.totalPage = totalPage; } public Pager<Picture> getPager() { return pager; } public void setPager(Pager<Picture> pager) { this.pager = pager; } public Map<String, Object> getRequest() { return request; } public void setRequest(Map<String, Object> request) { this.request = request; } public List<Picture> getPictures() { return pictures; } public void setPictures(List<Picture> pictures) { this.pictures = pictures; } public List<Album> getAlbums() { return albums; } public void setAlbums(List<Album> albums) { this.albums = albums; } public Map<String, Object> getSession() { return session; } public void setSession(Map<String, Object> session) { this.session = session; } public AlbumService getAlbumService() { return albumService; } @Resource public void setAlbumService(AlbumService albumService) { this.albumService = albumService; } public int getAlbumId() { return albumId; } public void setAlbumId(int albumId) { this.albumId = albumId; } public File getFiledata() { return Filedata; } public void setFiledata(File filedata) { Filedata = filedata; } public String getFiledataFileName() { return FiledataFileName; } public void setFiledataFileName(String filedataFileName) { FiledataFileName = filedataFileName; } public String getFiledataContentType() { return FiledataContentType; } public void setFiledataContentType(String filedataContentType) { FiledataContentType = filedataContentType; } public String getAlbumName() { return albumName; } public void setAlbumName(String albumName) { this.albumName = albumName; } public Album getAlbum() { return album; } public void setAlbum(Album album) { this.album = album; } public int getId() { return id; } public void setId(String id) { if (!Util.isNull(id)) { try { this.id = Integer.parseInt(id); } catch (NumberFormatException e) { } } } public Picture getPic() { return pic; } public void setPic(Picture pic) { this.pic = pic; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } }