/** * 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; } }
/** * Struts2Test * 使用Struts2上傳文件 */ package com.labci.struts2.action; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; 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;//文件上傳後保存的路徑 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; } @Override public String execute() throws Exception { 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); } } return SUCCESS; } }
<?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="1024000000"/> <package name="upload" extends="struts-default"> <action name="uploadFile" class="com.labci.struts2.action.UploadFileAction"> <param name="savePath">/upload</param> <result name="success">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>
<?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>
<%@ 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結合JQuery.uploadify實現帶進度的多文件上傳示例</title> <link href="js/uploadify.css" mce_href="js/uploadify.css" rel="stylesheet" type="text/css"/> <mce:script type="text/javascript" src="js/jquery-1.4.2.min.js" mce_src="js/jquery-1.4.2.min.js" ></mce:script> <mce:script type="text/javascript" src="js/swfobject.js" mce_src="js/swfobject.js" ></mce:script> <mce:script type="text/javascript" src="js/jquery.uploadify.v2.1.4.min.js" mce_src="js/jquery.uploadify.v2.1.4.min.js" ></mce:script> <mce:script type="text/javascript"><!-- $(function() { $("#cancelBtn").hide(); $("#full").hide(); $('#strutsUploadFile').uploadify({ 'uploader' : 'js/uploadify.swf', 'script' : 'uploadFile.action', 'cancelImg' : 'js/cancel.png', 'fileDataName':'fileName', //解決中文按鈕名的好方式 'buttonImg' : 'images/select.jpg', //可選 'height' : 20, //可選 'width' : 50, //設置允許上傳的文件格式 //'fileExt' : '*.jpg;*.gif;*.png', //設置允許上傳的文件格式後,必須加上下面這行代碼才能幫你過濾 //'fileDesc' : 'Image Files', //允許連續上傳多個文件 'multi':'true', //一次性最多允許上傳多少個,不設置的話默認爲999個 'queueSizeLimit' : 3, //每個文件允許上傳的大小(字節) //'sizeLimit' : 102400, 'onComplete' : function(event, ID, fileObj, response, data) { //當每個文件上傳完成後的操作 $("#cancel").hide(); $("#full").hide(); $("#show").append( "<a href="/" mce_href="/""downloadFile.action?fileName="+fileObj.name+"/">"+fileObj.name+"</a><br/>"); }, 'onAllComplete':function(event,data) { //當所有文件上傳完成後的操作 $("#cancelBtn").hide(); if(data.errors==0){ $("#allShow").append("所有文件已上傳成功(本次共上傳"+data.filesUploaded+"個),上傳總大小:"+data.allBytesLoaded+"字節,平均傳輸速度:"+data.speed+"KB/s"); }else{ $("#allShow").append("成功上傳"+data.filesUploaded+"個文件,失敗"+data.errors+"個,上傳總大小:"+data.allBytesLoaded+"字節,平均傳輸速度:"+data.speed+"KB/s"); } }, 'onOpen': function(event,ID,fileObj) { //當有文件正在上傳時的操作 $("#cancelBtn").show(); }, 'onQueueFull': function (event,queueSizeLimit) { //當添加待上傳的文件數量達到設置的上限時的操作 $("#full").append("<font color='red'><b>已經達到上傳數量限制了,不能再添加了</b></color><br/>"); $("#full").show(); return false; }, 'onCancel': function(event,ID,fileObj,data) { //當取消所有正在上傳文件後的操作 $("#cancelBtn").hide(); } }); }); // --></mce:script> </head> <body> <div id="full"></div> <div id="allShow"></div> <div id="show"></div> <input type="file" name="fileName" id="strutsUploadFile"/><br/> <input type="button" οnclick="javascript:$('#strutsUploadFile').uploadifyUpload()" value="確定上傳"/> <input type="button" id="cancelBtn" οnclick="javascript:$('#strutsUploadFile').uploadifyClearQueue()" value="取消上傳"/> </body> </html>
只要有文件正在上傳,則會出現“取消上傳”按鈕供取消所有上傳文件
上傳成功後可點相應鏈接進行下載:
添加待上傳文件數量超過設置上傳數量時的情況:
其它的操作細節不再列舉。
最近在讀《微服務架構設計模式》,開始的時候我非常的好奇,因爲在我印象中,設計模式是常說的那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
每一次探索都源於好奇 一、說明: 本系列主要是講一些開源框架的使用,幫助程序員更好更快的使用開源框架,以下內容出於本人對框架的理解,如果有不對或者不準確的地方請評論,謝謝。 我比較喜歡帶着問題去研究東西,所以我列出以下幾個問
0、相關文章: 文章1:Android 神兵利器Dagger2使用詳解(一)基礎使用(系列文章 四篇,第一篇剛開始如果@Inject不能用,就清除緩存重啓一下AS,在第三四篇裏面還有dagger-android的文章鏈接) Android
0、相關文章 探索Android路由框架-ARouter之深挖源碼(二)(3.3k閱讀量,65贊) ARouter原理剖析及手動實現(1.4w閱讀量,70贊,講的詳細) 阿里ARouter使用及源碼解析(一)(三篇文章,講的詳細) 1、測
0、相關資料 破解組件化開發的核心密碼,窺探阿里ARouter組件化路由框架的原理 B站上的相關視頻 目錄: 1、什麼是組件化?爲什麼要將項目進行組件化開發? 組件化架構: 好處: 但是模塊化開發有一個很大的問題就是,沒有依
0、相關文章 面試必問框架之ARouter源碼解析 1、簡單說一下使用ARouter跳轉到一個Activity的流程 我們先寫一個測試項目,如下: 有三個module:app、base、module-test1,其中app依賴base和
Libevent 是一個輕量級的開源高性能網絡庫,事件驅動(event-driven), 實現基於 Reactor 模式,網上學習資料衆多,這裏分享一下關於 signal 的處理。 首先給出 libevent 對 signal
初探HazelCast IMDG內存數據網格-簡介 文章目錄初探HazelCast IMDG內存數據網格-簡介一、內存數據網格(In Memory Data Grid)1.1 IMDG特點1.2 IMDG架構1.3 成熟的產品二
BBB由許多開源的服務組成,看似很麻煩,實際上拆分開每一個服務就很簡單了,組件化平臺化。 究竟BBB都用到了哪些開源服務? 我們來列舉一下,名稱均帶有對應官網鏈接。 1、Ubuntu烏班圖操作系統,友好的用戶交互界面; 2、Flex SD
Retrofit源碼解讀(五)–okhttpCall和adapt方法 標籤(空格分隔): Retrofit源碼 學習筆記 前言 以下的相關知識總結是通過慕課網的相關學習和自己的相關看法,如果有需要的可以去查看一下慕課網的相關教
OkHttp源碼解讀總結(七)—>RetryAndFollowUpInterceptor攔截器 標籤(空格分隔): OkHttp源碼 學習筆記 前言 以下的相關知識總結是通過慕課網的相關學習和自己的相關看法,如果有需要的可以去
OkHttp源碼解讀總結(九)—>okhttp的緩存策略 標籤(空格分隔): OkHttp源碼 學習筆記 前言 以下的相關知識總結是通過慕課網的相關學習和自己的相關看法,如果有需要的可以去查看一下慕課網的相關教學,感覺還可以。