Maison  >  Article  >  interface Web  >  Implémentation du téléchargement de fichiers avec barre de progression basée sur la technologie Ajax

Implémentation du téléchargement de fichiers avec barre de progression basée sur la technologie Ajax

亚连
亚连original
2018-05-23 17:00:291404parcourir

Cet article présente principalement les informations pertinentes sur la mise en œuvre du téléchargement de fichiers avec une barre de progression basée sur la technologie Ajax. Il est très bon et a une valeur de référence. Les amis dans le besoin peuvent s'y référer

. 1. Présentation

Dans le processus de développement d'applications Web ou de développement de sites Web, il est souvent nécessaire d'implémenter la fonction de téléchargement de fichiers. Pendant le processus de téléchargement de fichiers, les utilisateurs doivent souvent attendre longtemps. Afin d'informer les utilisateurs de la progression du téléchargement à temps, la barre de progression du téléchargement de fichier peut être affichée lors du téléchargement du fichier. Exécutez cette instance, comme le montre la figure 1, accédez à la page de téléchargement de fichiers, cliquez sur le bouton « Parcourir » pour sélectionner le fichier à télécharger, notez que le fichier ne peut pas dépasser 50 Mo, sinon le système affichera une invite d'erreur. Après avoir sélectionné le fichier à télécharger, cliquez sur le bouton « Soumettre », le fichier sera téléchargé et la progression du téléchargement sera affichée.

2. Points techniques

Appliquer principalement le composant open source Common-FileUpload pour réaliser le téléchargement de fichiers segmentés. de cette façon, la progression du téléchargement peut être obtenue en continu pendant le processus de téléchargement. Le composant Common-FileUpload est présenté en détail ci-dessous.

Le composant Common-FileUpload est un sous-projet du projet jakarta-commons sous l'organisation Apache. Ce composant peut facilement analyser divers champs de formulaire dans des requêtes de type multipart/form-data. Ce composant nécessite la prise en charge d'un autre composant appelé Common-IO. Ces deux fichiers de package de composants peuvent être téléchargés à partir du site Web http://commons.apache.org.

(1) Créer un objet de téléchargement

Lorsque le composant Common-FileUpload implémente le téléchargement de fichiers, un objet d'usine doit être créé et basé sur l'objet factory crée un nouvel objet de téléchargement de fichier. Le code spécifique est le suivant :

DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);

(2) Analyser. la demande de téléchargement

Après avoir créé un objet de téléchargement de fichier, vous pouvez utiliser l'objet pour analyser la demande de téléchargement et obtenir tous les éléments du formulaire. Cela peut être réalisé via la méthode parseRequest() de. objet de téléchargement de fichier. La structure syntaxique de la méthode parseRequest() est la suivante :

public List parseRequest(HttpServletRequest request) throws FileUploadException

(3) Classe FileItem

Dans le composant Common-FileUpload, les champs de fichier et les champs de formulaire ordinaires sont traités comme des objets FileItem. Si la méthode isFormField() de l'objet renvoie true, cela signifie qu'il s'agit d'un champ de formulaire ordinaire, sinon il s'agit d'un champ de fichier. Lors de l'implémentation du téléchargement de fichier, vous pouvez obtenir le nom du fichier téléchargé via la méthode getName() de la classe FileItem et obtenir la taille du fichier téléchargé via la méthode getSize().

3. Implémentation spécifique

(1) Créez le fichier request.js et écrivez la requête Ajax dans le méthode de fichier.

(2) Créez une nouvelle page de téléchargement de fichier index.jsp, ajoutez un formulaire et des éléments de formulaire pour obtenir les informations sur le fichier téléchargé, et ajoutez une balise e388a4556c0f65e1904146cc1a846bee 45a2772a6b6107b401db3c9b82c049c2 qui affiche le pourcentage, le code clé est le suivant :

<form enctype="multipart/form-data" method="post" action="UpLoad?action=uploadFile">

Veuillez sélectionner le fichier téléchargé : b301e54ace65aba24a2c2d15c60d9b5d

Remarque : Veuillez contrôler la taille du fichier dans les 50 Mo.

<p id="progressBar" class="prog_border" align="left">
<img src="images/progressBar.gif" width="0" height="13" id="imgProgress"></p>
<span id="progressPercent" style="width:40px;display:none">0%</span>
<input name="Submit" type="button" value="提交" onClick="deal(this.form)">
<input name="Reset" type="reset" class="btn_grey" value="重置"></td>
</form>

(3) Créez une nouvelle classe d'implémentation de servlet UpLpad pour télécharger des fichiers. Écrivez la méthode uploadFile() dans cette classe pour implémenter le téléchargement de fichiers. Dans cette méthode, le composant Common-FileUpload est utilisé pour télécharger des fichiers en sections, calculer le pourcentage de téléchargement et l'enregistrer dans la session en temps réel. comme suit :

public void uploadFile(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=GBK");
request.setCharacterEncoding("GBK");
HttpSession session=request.getSession();
session.setAttribute("progressBar",0); //定义指定上传进度的Session变量
String error = "";
int maxSize=50*1024*1024; //单个上传文件大小的上限
DiskFileItemFactory factory = new DiskFileItemFactory(); //创建工厂对象
ServletFileUpload upload = new ServletFileUpload(factory); //创建一个新的文件上传对象
try {
List items = upload.parseRequest(request); // 解析上传请求
Iterator itr = items.iterator(); // 枚举方法
while (itr.hasNext()) {
FileItem item = (FileItem) itr.next(); //获取FileItem对象
if (!item.isFormField()) { // 判断是否为文件域
if (item.getName() != null && !item.getName().equals("")) {//是否选择了文件
long upFileSize=item.getSize(); //上传文件的大小
String fileName=item.getName(); //获取文件名
if(upFileSize>maxSize){
error="您上传的文件太大,请选择不超过50M的文件";
break;
}
// 此时文件暂存在服务器的内存中
File tempFile = new File(fileName); //构造文件目录临时对象
String uploadPath = this.getServletContext().getRealPath("/upload");
File file = new File(uploadPath,tempFile.getName()); 
InputStream is=item.getInputStream();
int buffer=1024; //定义缓冲区的大小
int length=0;
byte[] b=new byte[buffer];
double percent=0;
FileOutputStream fos=new FileOutputStream(file);
while((length=is.read(b))!=-1){
percent+=length/(double)upFileSize*100D; //计算上传文件的百分比
fos.write(b,0,length); //向文件输出流写读取的数据
session.setAttribute("progressBar",Math.round(percent)); 
}
fos.close();
Thread.sleep(1000); //线程休眠1秒
} else {
error="没有选择上传文件!";
}
}
}
} catch (Exception e) {
e.printStackTrace();
error = "上传文件出现错误:" + e.getMessage();
}
if (!"".equals(error)) {
request.setAttribute("error", error);
request.getRequestDispatcher("error.jsp").forward(request, response);
}else {
request.setAttribute("result", "文件上传成功!");
request.getRequestDispatcher("upFile_deal.jsp").forward(request, response);
}
}

(4) Dans la page de téléchargement du fichier index.jsp, importez le fichier request.js de la requête Ajax écrite et écrivez une requête Ajax pour obtenir la méthode de progression du téléchargement et la fonction de rappel Ajax, le code clé est le suivant :

<script language="javascript" src="js/request.js"></script>
<script language="javascript">
var request = false;
function getProgress(){ 
var url="showProgress.jsp"; //服务器地址
var param ="nocache="+new Date().getTime(); //每次请求URL参数都不同 ,避免上传时进度条不动
request=httpRequest("post",url,true,callbackFunc,param); //调用请求方法 
}
//Ajax回调函数
function callbackFunc(){
if( request.readyState==4 ){ //判断响应是否完成 
if( request.status == 200 ){ //判断响应是否成功
var h = request.responseText; //获得返回的响应数据,该数据位上传进度百分比
h=h.replace(/\s/g,""); //去除字符串中的Unicode空白符
document.getElementById("progressPercent").style.display=""; //显示百分比 
progressPercent.innerHTML=h+"%"; //显示完成的百分比
document.getElementById("progressBar").style.display="block"; //显示进度条
document.getElementById("imgProgress").width=h*(235/100); //显示完成的进度
}
}
}
</script>

( 5) Écrivez la page showProgress.jsp et appliquez l'expression EL dans cette page. La formule affiche la valeur de la barre de progression du téléchargement stockée dans le champ de session. Le code spécifique est le suivant :

.
<%@page contentType="text/html" pageEncoding="GBK"%>
${progressBar}

(6) Écrivez le bouton d'envoi du formulaire en cliquant sur La méthode JavaScript appelée par l'événement demande au serveur à intervalles réguliers via la méthode setInterval() de l'objet window d'obtenir la dernière progression du téléchargement . Le code clé est le suivant :

function deal(form){
form.submit(); //提交表单
timer=window.setInterval("getProgress()",500); //每隔500毫秒获取一次上传进度
}

Ce qui précède est ce que j'ai compilé pour vous. J'espère qu'il vous sera utile. l'avenir.

Articles connexes :

Discussion des problèmes liés à readyState et au statut dans Ajax

Analyse complète de $.Ajax( ) Paramètres de la méthode (tutoriel graphique)

Problèmes de mise en cache Ajax et solutions sous IE8

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn