This article mainly introduces HTML5 AjaxFile uploadHow the progress bar is displayed. It is based on native HTML5 implementation and does not require falsh support. The progress can be customized and displayed, and the control is flexible. , friends who are interested in HTML5 upload progress bar can refer to
I originally planned to use jquery plug-in for asynchronous file upload, such as uploadfy, but it needs additional support. Some people use iframe to imitate the asynchronous upload mechanism, which feels like Rather awkward. Because the project does not consider lower version browsers, it was decided to use HTML5 for implementation. The following is just a simple demo, you need to make the specific style yourself.
The background is based on strut2 for file processing, which depends on the project. Just be careful about setting file size limits.
The first is the upload page, which is relatively simple and comes with the file. or this parameter.
upload.jsp
<%@page language="java" pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%> <% String path = request.getContextPath(); %> <!DOCTYPE html> <html> <head> <title>使用XMLHttpRequest上传文件</title> <script type="text/javascript"> var xhr = new XMLHttpRequest(); //监听选择文件信息 function fileSelected() { //HTML5文件API操作 var file = document.getElementById('fileName').files[0]; if (file) { var fileSize = 0; if (file.size > 1024 * 1024) fileSize = (Math.round(file.size * 100 / (1024 * 1024)) / 100).toString() + 'MB'; else fileSize = (Math.round(file.size * 100 / 1024) / 100).toString() + 'KB'; document.getElementById('fileName').innerHTML = 'Name: ' + file.name; document.getElementById('fileSize').innerHTML = 'Size: ' + fileSize; document.getElementById('fileType').innerHTML = 'Type: ' + file.type; } } //上传文件 function uploadFile() { var fd = new FormData(); //关联表单数据,可以是自定义参数 fd.append("name", document.getElementById('name').value); fd.append("fileName", document.getElementById('fileName').files[0]); //监听事件 xhr.upload.addEventListener("progress", uploadProgress, false); xhr.addEventListener("load", uploadComplete, false); xhr.addEventListener("error", uploadFailed, false); xhr.addEventListener("abort", uploadCanceled, false); //发送文件和表单自定义参数 xhr.open("POST", "<%=path%>/user/uploadifyTest_doUpload"); xhr.send(fd); } //取消上传 function cancleUploadFile(){ xhr.abort(); } //上传进度 function uploadProgress(evt) { if (evt.lengthComputable) { var percentComplete = Math.round(evt.loaded * 100 / evt.total); document.getElementById('progressNumber').innerHTML = percentComplete.toString() + '%'; } else { document.getElementById('progressNumber').innerHTML = 'unable to compute'; } } //上传成功响应 function uploadComplete(evt) { //服务断接收完文件返回的结果 alert(evt.target.responseText); } //上传失败 function uploadFailed(evt) { alert("上传失败"); } //取消上传 function uploadCanceled(evt) { alert("您取消了本次上传."); } </script> </head> <body> <form id="form1" enctype="multipart/form-data" method="post" action="upload.php"> <p class="row"> <label for="fileToUpload">选择文件</label> <input type="file" name="fileName" id="fileName" onchange="fileSelected();"/> </p> <p id="fileName"></p> <p id="fileSize"></p> <p id="fileType"></p> <p class="row"> 上传者:<input type="text" name="name" id="name"/> <input type="button" onclick="uploadFile()" value="上传" /> <input type="button" onclick="cancleUploadFile()" value="取消" /> </p> <p id="progressNumber"></p> </form> </body> </html>
fd.append("name", document.getElementById('name').value);
fd.append("fileName", document.getElementById('fileName').files[0]);
These two sentences bind data to the form. Because html5 supports multiple file uploads,
document.getElementById('fileName').files
returns an array. There is only one file here so remove the element with index 0.
xhr.upload.addEventListener("progress", uploadProgress, false);
##xhr.addEventListener("load", uploadComplete, false);
xhr.addEventListener("error", uploadFailed, false);
##xhr.addEventListener("abort", uploadCanceled, false );Bind progress, upload, error, and interruption events here to provide some interaction. The file progress is displayed in the progress callback.
Then paste the background code and action configuration, UploadifyTestAction.java
package com.bjhit.eranges.actions.test; import java.io.File; import com.opensymphony.xwork2.ActionSupport; public class UploadifyTestAction extends ActionSupport { private static final long serialVersionUID = 837481714629791752L; private File fileName; private String name; private String responseInfo; public String doUpload() throws Exception { System.out.println(name); File myFile = fileName; System.out.println(myFile.getName()); responseInfo = "上传成功!"; return "doUpload"; } public String getName() { return name; } public void setName(String name) { this.name = name; } public File getFileName() { return fileName; } public void setFileName(File fileName) { this.fileName = fileName; } public String getResponseInfo() { return responseInfo; } public void setResponseInfo(String responseInfo) { this.responseInfo = responseInfo; } }
<!-- 文件上传例子 --> <action name="uploadifyTest_*" class="com.bjhit.eranges.actions.test.UploadifyTestAction" method="{1}"> <result name="doUpload" type="json"> <param name="includeProperties">responseInfo</param> <param name="excludeNullProperties">true</param> </result> </action>
Related recommendations:
How to implement HTML5 brick-breaking game using native jsAjax implementation of flicker-free scheduled refresh page example code Questions about the use of get and post in AjaxThe above is the detailed content of How to display the HTML5 Ajax file upload progress bar. For more information, please follow other related articles on the PHP Chinese website!