/** * Struts2Test * 使用Struts2上傳文件 */ package com.labci.struts2.action; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.interceptor.ServletRequestAware; import com.opensymphony.xwork2.ActionSupport; /** * @author Bill Tu(tujiyue/iwtxokhtd) * Jun 8, 2011[8:31:01 PM] * */ public class UploadFileAction extends ActionSupport implements ServletRequestAware { /** * */ private static final long serialVersionUID = -1896915260152387341L; private HttpServletRequest request; public void setServletRequest(HttpServletRequest req) { this.request=req; } private List<File> fileName;//這裏的"fileName"一定要與表單中的文件域名相同 private List<String> fileNameContentType;//格式同上"fileName"+ContentType private List<String> fileNameFileName;//格式同上"fileName"+FileName private String savePath;//文件上傳後保存的路徑 private String allowTypes;//允許上傳的文件類型 public List<File> getFileName() { return fileName; } public void setFileName(List<File> fileName) { this.fileName = fileName; } public List<String> getFileNameContentType() { return fileNameContentType; } public void setFileNameContentType(List<String> fileNameContentType) { this.fileNameContentType = fileNameContentType; } public List<String> getFileNameFileName() { return fileNameFileName; } public void setFileNameFileName(List<String> fileNameFileName) { this.fileNameFileName = fileNameFileName; } @SuppressWarnings("deprecation") public String getSavePath() { return request.getRealPath(savePath); } public void setSavePath(String savePath) { this.savePath = savePath; } public String getAllowTypes() { return allowTypes; } public void setAllowTypes(String allowTypes) { this.allowTypes = allowTypes; } @Override public String execute() throws Exception { //得到文件的類型 List<String> fileTypes=getFileNameContentType(); String []allowTypes=getAllowTypes().split(","); List<String> typesList=Arrays.asList(allowTypes); boolean allowFlag=true;//是否存在不允許上傳的文件類型 for(String type:fileTypes){ if(!typesList.contains(type)){ allowFlag=false; break; } } if(!allowFlag){ request.setAttribute("fileTypeError", "您上傳的文件中存在不允許上傳的類型,允許上傳的類型爲:"+getAllowTypes()); return INPUT; } //允許上傳 File dir=new File(getSavePath()); if(!dir.exists()){ dir.mkdirs(); } List<File> files=getFileName(); for(int i=0;i<files.size();i++){ FileOutputStream fos=new FileOutputStream(getSavePath()+"//"+getFileNameFileName().get(i)); FileInputStream fis=new FileInputStream(getFileName().get(i)); byte []buffers=new byte[1024]; int len=0; while((len=fis.read(buffers))!=-1){ fos.write(buffers,0,len); } } List<String> fileHrefsList=new ArrayList<String>(); for(String fileName:getFileNameFileName()){ String href="<a href="/" mce_href="/""downloadFile.action?fileName="+fileName+"/">"+fileName+"</a>"; fileHrefsList.add(href); } request.setAttribute("fileNameList", fileHrefsList); return SUCCESS; } }
<%@ page language="java" contentType="text/html;charset=utf-8" pageEncoding="utf-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Struts2多文件上傳</title> </head> <body> <table> <tr> <td> <c:choose> <c:when test="${!empty fileTypeError}"> <font color="red"><b>${fileTypeError}</b></font> </c:when> <c:otherwise> <c:forEach items="${fileNameList}" var="fileName"> ${fileName}<br/> </c:forEach> </c:otherwise> </c:choose> </td> </tr> </table> <!-- 不一定要選擇所有文件纔可以上傳 --> <form action="uploadFile.action" method="post" enctype="multipart/form-data"> <input type="file" name="fileName"/><br/> <input type="file" name="fileName"/><br/> <input type="file" name="fileName"/><br/> <input type="submit" value="上傳"/> </form> </body> </html>
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <filter> <filter-name>struts2</filter-name> <filter-class> org.apache.struts2.dispatcher.FilterDispatcher </filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>*.action</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constant name="struts.devMode" value="false" /> <!-- 改變struts2默認爲2M的上傳文件大小限制 --> <constant name="struts.multipart.maxSize" value="10240000"/> <package name="upload" extends="struts-default"> <action name="uploadFile" class="com.labci.struts2.action.UploadFileAction"> <param name="savePath">/upload</param> <param name="allowTypes">text/plain,text/xml,text/html,image/gif,image/png,image/jpeg,image/jpg,image/bmp</param> <result name="success">index.jsp</result> <result name="input">index.jsp</result> </action> <action name="downloadFile" class="com.labci.struts2.action.DownloadFileAction"> <param name="savePath">/upload</param> <result name="success">index.jsp</result> </action> </package> </struts>
/** * Struts2Test * 文件下載的Action */ package com.labci.struts2.action; import java.io.FileInputStream; import java.io.InputStream; import java.io.OutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts2.interceptor.ServletRequestAware; import org.apache.struts2.interceptor.ServletResponseAware; import com.opensymphony.xwork2.ActionSupport; /** * @author Bill Tu(tujiyue/iwtxokhtd) * Jun 8, 2011[9:15:15 PM] * */ public class DownloadFileAction extends ActionSupport implements ServletRequestAware, ServletResponseAware { /** * */ private static final long serialVersionUID = -7448748577778248376L; private HttpServletRequest request; private HttpServletResponse response; private String savePath; @Override public String execute() throws Exception { String fileName=request.getParameter("fileName"); String fullPath=getSavePath()+"//"+fileName; fileName=new String(fileName.getBytes("utf-8"),"iso-8859-1"); InputStream is=new FileInputStream(fullPath); int len=0; byte []buffers=new byte[1024]; response.reset(); response.setContentType("application/x-msdownload"); response.addHeader("Content-Disposition", "attachment;filename=/""+fileName+"/""); //把文件內容通過輸出流打印到頁面上供下載 while((len=is.read(buffers))!=-1){ OutputStream os=response.getOutputStream(); os.write(buffers, 0, len); } is.close(); return SUCCESS; } public void setServletRequest(HttpServletRequest req) { this.request=req; } public void setServletResponse(HttpServletResponse resp) { this.response=resp; } @SuppressWarnings("deprecation") public String getSavePath() { return request.getRealPath(savePath); } public void setSavePath(String savePath) { this.savePath = savePath; } }
最近在讀《微服務架構設計模式》,開始的時候我非常的好奇,因爲在我印象中,設計模式是常說的那23種設計模式,而微服務的設計模式又是什麼呢?這個問題也留給大家,在文末我會附上我對這個問題的理解。本次文章的內容主要是工作中對微服務設計模式的應
本文分享自華爲雲社區《如何基於香橙派AIpro將開源框架模型轉換爲昇騰模型》,作者:昇騰CANN。 在前面的介紹中,我們知道了如何基於香橙派AIpro開發AI推理應用,也大致瞭解到在推理之前,需要把原始網絡模型 (可能是 PyTorch 的
1 開源解析和拆分文檔 第三方的工具去對文件解析拆分,去將我們的文件內容給提取出來,並將我們的文檔內容去拆分成一個小的chunk。常見的PDF word mark down, JSON、HTML。都可以有很好的一些模塊去把這些文件去進行一個
環境 操作系統:Debian 12 BookWorm、13 Trixie、銀河麒麟(Kylin)V10 SP1 2303、紅旗(RedFlag) V11、優麒麟 Ubuntu Kylin 22.04 適用架構:ARM64(華爲鯤鵬 920
背景 spring和mybatis集成過程中,我們可以通過MapperFactoryBean的方式配置Mapper接口。但是這樣需要在配置文件中,爲每個mapper配置相同的代碼塊,浪費時間。關鍵對於代碼潔癖的人來說,一點不能忍。 <bea
爲什麼要研究字符串? 人機交互的過程中,文字、數字、字母、符號都是字符表現形式,這部分內容佔了人機信息交互的大部分內容,所以有必要明確一些基本問題。因此大部分數據類型都應該有字符串表達形式,我們在定義新類型的時候可以根據需要來定義新類型的
security的簡單原理: 使用衆多的攔截器對url攔截,以此來管理權限。但是這麼多攔截器,不可能對其一一來講,主要講裏面核心流程的兩個。 首先,權限管理離不開登陸驗證的,所以登陸驗證攔截器AuthenticationProcessing
我們經常會需要啓動多個實例的情況來測試註冊中心、配置中心等基礎設施的高可用,也會用來測試客戶端負載均衡的調用等。但是,我們一個應用只能有一個端口號,這就使得在本機測試的時候,不得不爲同一個服務設置不同的端口來進行啓動。 在本地用不同端口啓動
簡介 Java Reflection,稱爲 Java 反射,是Java基礎部分的一個比較難的點。Reflection(反射)是被視爲動態語言的關鍵,通過反射機制,我們可以在運行時(runtime)獲取類的完整結構。例如,可以獲取到
一面 1. 簡短自我介紹 2. 事務的ACID,其中把事務的隔離性詳細解釋一遍 3. 髒讀、幻影讀、不可重複讀 4. 紅黑樹、二叉樹的算法 5. 平常用到哪些集合類?ArrayList和LinkedList區別?HashMap內部數據結構
當我們站在技術之路的原點,未來可能充滿了迷茫,也存在着很多不同的可能。在這個知識爆炸與終身學習/碎片化學習爲主的時代,我們面臨的問題之一就是如何進行有效學習,不僅能有效平衡廣度與深度,並且能真正的積澱下來,提升自己的研發效能。於筆者而
阿里巴巴Java開發手冊 梳理筆記 - finally 塊必須對資源對象、流對象進行關閉 規約內容: 2.1 異常處理 6. 【強制】 finally 塊必須對資源對象、流對象進行關閉,有異常也要做 try - catch 。 說明:如果
在Java方面,能夠實現多線程安全修改對象值得方法只有2個 1.原子操作 2.互斥方法 而在Java當中,或是其他語言中,基本上也都是使用CAS實現。CAS是比較並交換的意思,這個操作包含2個連續的操作,比較,還有賦值,因爲2個操作在cpu
單線程輪詢並執行任務,有可能會導致飢餓。比較適合於一些具有一個任務的週期調度。 任務列表用數組存儲,元素最前面的元素是最先被執行的任務。 schedule方法是固定間隔執行,根據上一次執行的結束時間來定義間隔的開始時間 scheduleAt
創建的ReadWriteLock需要使用兩個方法來繼續創造2個對象,分別是ReadLock和WriteLock。 這兩個鎖對象的方法調用都會匯聚到ReadWriteLock的Sync類中。多個對象的方法調用匯聚到一個對象上面,這個設計模式是