Maison >interface Web >js tutoriel >Implémentation du travail Web pour le téléchargement de fichiers et le code de téléchargement Explication détaillée_Compétences Javascript
Cet article présente principalement la connaissance du téléchargement et du téléchargement de fichiers Webwork sous trois aspects, dont les trois aspects suivants :
1. Demande de demande d'emballage
2. Obtenez la classe d'analyse pour le téléchargement de fichiers
3. Configuration et utilisation réelle du projet
Le téléchargement et le téléchargement sur le Web devraient être une exigence très courante, qu'il s'agisse d'un petit site Web ou d'un site Web de trading avec un accès simultané important. Bien entendu, WebWork fournit également un intercepteur très convivial pour implémenter le téléchargement de fichiers, nous permettant de nous concentrer sur la conception et la mise en œuvre de la logique métier. Lors de la mise en œuvre du téléchargement et du téléchargement, nous prêtons également attention à la mise en œuvre du téléchargement et du téléchargement du framework.
1. Demande de demande d'emballage
•Chaque fois que le client demande une action, la méthode ServletDispatcher.service() de la classe de répartition WebWork sera appelée.
Pour le processus spécifique, veuillez vous référer à : Explication détaillée de la méthode d'appel d'Action dans Webwork
public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException { try { if (encoding != null) { try { request.setCharacterEncoding(encoding); } catch (Exception localException) { } } if (locale != null) { response.setLocale(locale); } if (this.paramsWorkaroundEnabled) { request.getParameter("foo"); } request = wrapRequest(request); //封装 request请求 serviceAction(request, response, getNameSpace(request), getActionName(request), getRequestMap(request), getParameterMap(request), getSessionMap(request), getApplicationMap()); } catch (IOException e) { String message = "Could not wrap servlet request with MultipartRequestWrapper!"; log.error(message, e); sendError(request, response, 500, new ServletException(message, e)); } }
Voyons d’abord ce que fait la méthode wrapRequest :
protected HttpServletRequest wrapRequest(HttpServletRequest request) throws IOException { if ((request instanceof MultiPartRequestWrapper)) { return request; } if (MultiPartRequest.isMultiPart(request)) { request = new MultiPartRequestWrapper(request, getSaveDir(), getMaxSize()); } return request; }
• Tout d'abord, il détermine si la requête entrante a été encapsulée par MultiPartRequestWrapper. Si c'est le cas, elle renvoie directement.
• Sinon, déterminez si le ContentType dans les informations d'en-tête de la demande est une demande de paramètre multi-type (multipart/formdata). Si tel est le cas, enveloppez la demande dans le propre type MultiPartRequestWrapper de WebWork, qui hérite de HttpServletRequestWrapper.
La méthode MultiPartRequest.isMultiPart() est implémentée comme suit :
public static boolean isMultiPart(HttpServletRequest request){ String content_type = request.getHeader("Content-Type"); return content_type != null && content_type.startsWith("multipart/form-data"); }
•La configuration du répertoire de stockage temporaire des fichiers et de la taille maximale de téléchargement dans webwork.properties entre en jeu à ce moment-là.
•Les paramètres passés lors de la création de l'objet MultiPartRequestWrapper sont obtenus par les méthodes getSaveDir() et getMaxSize().
•Dans la méthode, les attributs webwork.multipart.saveDir et webwork.multipart.maxSize dans la configuration seront recherchés. S'ils sont trouvés, le répertoire temporaire spécifié par l'attribut et le contenu maximum téléchargé seront utilisés. Le répertoire de l'environnement sera utilisé.
La mise en œuvre spécifique est la suivante :
protected String getSaveDir() { String saveDir = Configuration.getString("webwork.multipart.saveDir").trim(); if (saveDir.equals("")) { File tempdir = (File) getServletConfig().getServletContext().getAttribute("javax.servlet.context.tempdir"); log.info("Unable to find 'webwork.multipart.saveDir' property setting. Defaulting to javax.servlet.context.tempdir"); if (tempdir != null) { saveDir = tempdir.toString(); } } else { File multipartSaveDir = new File(saveDir); if (!multipartSaveDir.exists()) { multipartSaveDir.mkdir(); } } if (log.isDebugEnabled()) { log.debug("saveDir=" + saveDir); } return saveDir; }
2. Obtenez la classe d'analyse pour le téléchargement de fichiers
Voyons comment le constructeur de MultiPartRequestWrapper encapsule la requête :
public MultiPartRequestWrapper(HttpServletRequest request, String saveDir, int maxSize) throws IOException { super(request); if ((request instanceof MultiPartRequest)) { this.multi = ((MultiPartRequest) request); } else { String parser = ""; parser = Configuration.getString("webwork.multipart.parser"); if (parser.equals("")) { log.warn("Property webwork.multipart.parser not set. Using com.opensymphony.webwork.dispatcher.multipart.PellMultiPartRequest"); parser = "com.opensymphony.webwork.dispatcher.multipart.PellMultiPartRequest"; } else if (parser.equals("pell")) { parser = "com.opensymphony.webwork.dispatcher.multipart.PellMultiPartRequest"; } else if (parser.equals("cos")) { parser = "com.opensymphony.webwork.dispatcher.multipart.CosMultiPartRequest"; } else if (parser.equals("jakarta")) { parser = "com.opensymphony.webwork.dispatcher.multipart.JakartaMultiPartRequest"; } try { Class baseClazz = MultiPartRequest.class; Class clazz = Class.forName(parser); if (!baseClazz.isAssignableFrom(clazz)) { addError("Class '" + parser + "' does not extend MultiPartRequest"); return; } Constructor ctor = clazz.getDeclaredConstructor(new Class[] { Class.forName("javax.servlet.http.HttpServletRequest"), String.class, Integer.TYPE }); Object[] parms = { request, saveDir, new Integer(maxSize) }; this.multi = ((MultiPartRequest) ctor.newInstance(parms)); } catch (ClassNotFoundException e) { addError("Class: " + parser + " not found."); } catch (NoSuchMethodException e) { addError("Constructor error for " + parser + ": " + e); } catch (InstantiationException e) { addError("Error instantiating " + parser + ": " + e); } catch (IllegalAccessException e) { addError("Access errror for " + parser + ": " + e); } catch (InvocationTargetException e) { addError(e.getTargetException().toString()); } } }
• Tout d'abord, il détermine si la requête entrante est une sous-classe de la classe abstraite MultiPartRequest. Si c'est le cas, elle fait directement référence à la requête par sa propre variable de type MultiPartRequest.
• Sinon, lisez la propriété webwork.multipart.parser de la configuration de WebWork, qui détermine ce que Webwork utilise en interne pour implémenter le téléchargement de fichiers. Si elle n’est pas spécifiée, l’implémentation de PellMultiPartRequest est utilisée par défaut.
•Après avoir trouvé la classe configurée, WebWork crée une instance de cette classe via la réflexion Java. Toutes les classes prises en charge héritent de MultiPartRequest. Après avoir créé l'instance, elles sont converties vers le haut et affectées au membre multi de MultiPartRequestWrapper.
• Le téléchargement de fichiers de WebWork encapsule plusieurs bibliothèques FileUpload courantes et n'est pas implémenté par lui-même.
•Il comprend trois implémentations : pell, cos et apache common. WebWork encapsule ces trois packages et fournit une interface d'accès commune MultiPartRequest. Les implémentations détaillées sont PellMultiPartRequest, CosMultiPartRequest et JakartaMultiPartRequest.
• Jakarta prend en charge plusieurs fichiers utilisant le même nom de paramètre HTTP. Si vous utilisez directement l'intercepteur FileUpload de WebWork, il est recommandé d'utiliser pell, car lorsque vous téléchargez un fichier avec un nom de fichier chinois, seul le package pell obtiendra correctement le nom de fichier chinois, et Apache common changera le nom de fichier en fichier. comme le nom xxx.tmp, et cos sera tronqué, donc notre seul choix est pell.
•La fonction de cos est relativement puissante, mais l'encapsulation de WebWork lui fait perdre beaucoup de fonctions car il faut définir l'encodage des caractères de la requête. L'encapsulation de WebWork n'est pas définie, ce qui conduit au problème tronqué de cos. Bien sûr, si vous utilisez cos seul, vous éviterez de tels problèmes.
3. Configuration et utilisation réelle du projet
• Fichiers de configuration
configuration des actions :
<action name="uploadAttach" class=".....attach.action.uploadAttach" caption="上传附件"> <result name="success" type="dispatcher"> <param name="location">/result.jsp</param> </result> <result name="error" type="dispatcher"> <param name="location">/result.jsp</param> </result> <interceptor-ref name="defaultStack" /> <interceptor-ref name="fileUploadStack" /> //webwok 上传所需要的拦截栈 </action> //拦截栈的定义 <interceptor-stack name="fileUploadStack"> <interceptor-ref name="fileUpload"/> <interceptor-ref name="params"/> </interceptor-stack> //拦截栈对应的拦截器 <interceptor name="fileUpload" class="com.opensymphony.webwork.interceptor.FileUploadInterceptor"/> <interceptor name="params" class="com.opensymphony.xwork.interceptor.ParametersInterceptor"/>
•Le front-end utilise Ajaxupload, qui est relativement stable et puissant. Je n'entrerai pas dans les détails ici. Il existe un site officiel : jQuery AjaxUpload code de téléchargement d'image
.•En encapsulant la demande de téléchargement Webwork et en obtenant la classe d'analyse, tous les préliminaires ont été préparés. L'implémentation spécifique dans l'intercepteur de téléchargement est la suivante :
public String intercept(ActionInvocation invocation) throws Exception {if (!(ServletActionContext.getRequest() instanceof MultiPartRequestWrapper)) { if (log.isDebugEnabled()) { log.debug("bypass " + invocation.getProxy().getNamespace() + "/" + invocation.getProxy().getActionName()); } return invocation.invoke(); } Action action = invocation.getAction(); ValidationAware validation = null; if ((action instanceof ValidationAware)) { validation = (ValidationAware) action; } MultiPartRequestWrapper multiWrapper = (MultiPartRequestWrapper) ServletActionContext.getRequest(); if (multiWrapper.hasErrors()) { Collection errors = multiWrapper.getErrors(); Iterator i = errors.iterator(); while (i.hasNext()) { String error = (String) i.next(); if (validation != null) { validation.addActionError(error); } log.error(error); } } Enumeration e = multiWrapper.getFileParameterNames(); while ((e != null) && (e.hasMoreElements())) { String inputName = (String) e.nextElement(); String[] contentType = multiWrapper.getContentTypes(inputName); String[] fileName = multiWrapper.getFileNames(inputName); File[] file = multiWrapper.getFiles(inputName); if (file != null) { for (int i = 0; i < file.length; i++) { log.info("file " + inputName + " " + contentType[i] + " " + fileName[i] + " " + file[i]); } } if (file == null) { if (validation != null) { validation.addFieldError(inputName, "Could not upload file(s). Perhaps it is too large?"); } log.error("Error uploading: " + fileName); } else { invocation.getInvocationContext().getParameters().put(inputName, file); invocation.getInvocationContext().getParameters().put(inputName + "ContentType", contentType); invocation.getInvocationContext().getParameters().put(inputName + "FileName", fileName); } } String result = invocation.invoke(); for (Enumeration e1 = multiWrapper.getFileParameterNames(); e1 != null && e1.hasMoreElements();) { String inputValue = (String) e1.nextElement(); File file[] = multiWrapper.getFiles(inputValue); for (int i = 0; i < file.length; i++) { File f = file[i]; log.info("removing file " + inputValue + " " + f); if (f != null && f.isFile()) f.delete(); } } return result; }
•Déterminez d'abord si la requête en cours contient une requête multimédia, si c'est le cas, enregistrez le journal et exécutez l'action.
• Déterminez ensuite si MultiPartRequestWrapper contient des erreurs pendant le processus de téléchargement de fichier, renvoyez les informations d'erreur au client et ne continuez pas à appeler Action.
•Si aucune des conditions de jugement ci-dessus n'est remplie, commencez à parcourir les paramètres du fichier téléchargé dans MultiPartRequestWrapper et placez le nom du fichier et le type de contenu du fichier dans la mappe des paramètres d'action pour que les classes métier suivantes fonctionnent.
•Dans la fonction d'intercepteur de téléchargement de fichiers de WebWork, le fichier qu'il fournit n'est qu'un fichier temporaire, qui sera automatiquement supprimé après l'exécution de l'action. Vous devez gérer vous-même le stockage du fichier dans l'action ou l'écrire dans un répertoire. le serveur, ou Enregistrer dans la base de données. Si vous envisagez d'écrire dans un répertoire sur le serveur, vous devez faire face au problème de gérer vous-même le même nom de fichier, mais en fait, le package cos fournit déjà des règles de renommage automatique pour les renommages de fichiers.
Le code ci-dessus vous présente les connaissances pertinentes de Webwork pour le téléchargement et le téléchargement de fichiers. J'espère qu'il vous sera utile.