日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

继上一篇博客--javaweb通过接口来实现多个文件压缩和下载(包括单文件下载,多文件批量下载)

發(fā)布時(shí)間:2025/3/12 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 继上一篇博客--javaweb通过接口来实现多个文件压缩和下载(包括单文件下载,多文件批量下载) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

通過動態(tài)分配地址來提升javaweb文件下載接口的其兼容性和可擴(kuò)展性:

(上篇博文地址:https://blog.csdn.net/weixin_37766296/article/details/80044000)


log4j.properties?文件:

log4j.rootLogger = debug,stdout,D,Elog4j.logger.java.sql.ResultSet=INFOlog4j.logger.java.sql.apache=INFOlog4j.logger.java.sql.Connnection=DEGUGlog4j.logger.java.sql.Statement=DEGUGlog4j.logger.java.sql.PreparedStatement=DEGUGlog4j.appender.D = org.apache.log4j.DailyRollingFileAppenderlog4j.appender.D.File = log4j.appender.D.Append = truelog4j.appender.D.Threshold = DEBUG log4j.appender.D.layout = org.apache.log4j.PatternLayoutlog4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%nlog4j.appender.E = org.apache.log4j.DailyRollingFileAppenderlog4j.appender.E.File = log4j.appender.E.Append = truelog4j.appender.E.Threshold = ERROR log4j.appender.E.layout = org.apache.log4j.PatternLayoutlog4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n

你會發(fā)現(xiàn):

log4j.appender.D.File =

這里是空的,不急,容我慢慢解釋。

上面是日志文件的配置。下面是web.xml文件的配置:

<!-- log4j文件的配置 (千萬要注意的是下面的classes記得加上去,雖然工程目錄可能沒有,但是實(shí)際目錄可能是有的)--> <servlet> <servlet-name>lo4jInit</servlet-name> ()<servlet-class>com.fx.init.Lo4jInit</servlet-class> (這里要慎重,servlet類名:由package+class名組成)<init-param> <param-name>log4j_init_path</param-name> (這里是用來初始化的一些參數(shù),在init()方法中通過getInitParameter()方法獲得)<param-value>WEB-INF\classes\log4j.properties</param-value> (跟上面一個(gè)參數(shù)匹配,類似于一對鍵值對) </init-param> <load-on-startup>0</load-on-startup> </servlet>

web容器啟動時(shí)是先 初始化web.xml文件,然后在根據(jù)web.xml中的配置進(jìn)行部署

接下來就是init()方法的實(shí)現(xiàn)了。。


public class Lo4jInit extends HttpServlet {private static final long serialVersionUID = 1L;private static Logger logger = Logger.getLogger(Lo4jInit.class);/* web容器初始化 */public void init() {/* 部署在tomcat下的絕對路徑 */String path = this.getServletContext().getRealPath("/");/* 獲取web.xml文件中name為log4j_init_path的value值 */String file = this.getInitParameter("log4j_init_path");if (file != null) {Properties prop = new Properties();String root = path;/* 設(shè)置文件輸出的路徑 */String root1 = root + "/logs/log.txt";String root2 = root + "logs/error.txt";System.out.println("root1:" + root1);System.out.println("root2:" + root2);try {prop.load(new FileInputStream(path + file)); // 加載log4j.propertiesprop.setProperty("log4j.appender.D.File", root1); // 設(shè)置日志文件的輸出路徑prop.setProperty("log4j.appender.E.File", root2); // 設(shè)置日志文件的輸出路徑PropertyConfigurator.configure(prop); // 加載配置項(xiàng)} catch (Exception e) {System.out.println("any exception??");logger.info("初始化log4j日志輸入路徑異常,請檢查web.xml參數(shù)配置是否正常,異常發(fā)生在" + this.getClass().getName()+ "類的public void init()方法,異常的愿意是:" + e.getMessage(), e.fillInStackTrace());}}}protected void service(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {}}

最后附上download接口的實(shí)現(xiàn):(在之前一篇博文我有詳細(xì)介紹,這里就不詳細(xì)介紹了)

@Controller public class FilesController {@RequestMapping(value = "/download")public void download(HttpServletRequest request, HttpServletResponse response) throws Exception {String zipBasePath = request.getSession().getServletContext().getRealPath("/logs");System.out.println("starting download...");/* 判斷文件夾是否有文件,遍歷文件夾中的文件。。。 */String path = zipBasePath;Vector<String> vecFile = new Vector<String>();recursion(path, vecFile);System.out.println("文件路徑分別是:");for (String fileName : vecFile) {System.out.println(fileName);}/* 設(shè)置下載文件的名稱 */String fileName = "logs.zip";response.setContentType("text/html; charset=UTF-8"); // 設(shè)置編碼字符response.setContentType("application/x-msdownload"); // 設(shè)置內(nèi)容類型為下載類型response.setHeader("Content-disposition", "attachment;filename=" + fileName);// 設(shè)置下載的文件名稱OutputStream out = response.getOutputStream(); // 創(chuàng)建頁返回方式為輸出流,會自動彈出下載框/* 創(chuàng)建壓縮文件需要的空的zip包 ,這里是自動生成的,不用我們自己去生成 */String zipFilePath = zipBasePath + "temp.zip";System.out.println("create the empty zip file successfully...");/* 根據(jù)臨時(shí)的zip壓縮包路徑,創(chuàng)建zip文件 */File zip = new File(zipFilePath);if (!zip.exists()) {zip.createNewFile();}System.out.println("create the zip file successfully...");/* 創(chuàng)建zip文件輸出流 */FileOutputStream fos = new FileOutputStream(zip);ZipOutputStream zos = new ZipOutputStream(fos);System.out.println("create the empty zip stream successfully....");/* 循環(huán)讀取文件路徑集合,獲取每一個(gè)文件的路徑(將文件一個(gè)一個(gè)進(jìn)行壓縮) */for (String fp : vecFile) {File f = new File(fp); // 根據(jù)文件路徑創(chuàng)建文件zipFile(f, zos); // 將每一個(gè)文件寫入zip文件包內(nèi),即進(jìn)行打包}zos.close();System.out.println("files zipped over, starting to download");/* 將打包后的文件寫到客戶端,有兩種方法可以實(shí)現(xiàn)(下面會進(jìn)行介紹),這里使用緩沖流輸出 */InputStream fis = new BufferedInputStream(new FileInputStream(zipFilePath));byte[] buff = new byte[4096];int size = 0;while ((size = fis.read(buff)) != -1) {out.write(buff, 0, size);}System.out.println("package is download successfully");// 釋放和關(guān)閉輸入輸出流out.flush();out.close();fis.close();}public void zipFile(File inputFile, ZipOutputStream zipoutputStream) {try {if (inputFile.exists()) { // 判斷文件是否存在if (inputFile.isFile()) { // 判斷是否屬于文件,還是文件夾// 創(chuàng)建輸入流讀取文件FileInputStream fis = new FileInputStream(inputFile);BufferedInputStream bis = new BufferedInputStream(fis);// 將文件寫入zip內(nèi),即將文件進(jìn)行打包ZipEntry ze = new ZipEntry(inputFile.getName()); // 獲取文件名zipoutputStream.putNextEntry(ze);// 寫入文件的方法,同上byte[] b = new byte[1024];long l = 0;while (l < inputFile.length()) {int j = bis.read(b, 0, 1024);l += j;zipoutputStream.write(b, 0, j);}// 關(guān)閉輸入輸出流bis.close();fis.close();} else { // 如果是文件夾,則使用窮舉的方法獲取文件,寫入ziptry {File[] files = inputFile.listFiles();for (int i = 0; i < files.length; i++) {zipFile(files[i], zipoutputStream);}} catch (Exception e) {e.printStackTrace();}}}} catch (Exception e) {e.printStackTrace();}}public void recursion(String root, Vector<String> vecFile) {String path = root;File file = new File(root);if (file.exists()) {System.out.println("this file is exit!");File[] subFile = file.listFiles();for (int i = 0; i < subFile.length; i++) {if (subFile[i].isDirectory()) {recursion(subFile[i].getAbsolutePath(), vecFile);} else {String filename = subFile[i].getName();vecFile.add(path + File.separator + filename);}}} else {System.out.println("this file is not exit!");}}}

最后總結(jié)一下編程過程中遇到一些困難以及解決方法:

1. 在編寫Spring的applicationContext.xml文件時(shí),無緣無故出現(xiàn)了:

cvc-complex-type.2.3: Element 'beans' cannot have character [children], because the type's content type is element-only.錯(cuò)誤。


錯(cuò)誤原因:Spring在初始化的時(shí)候無法識別applicationContext.xml中的元素。

可能產(chǎn)生該錯(cuò)誤的原因:網(wǎng)上復(fù)制的代碼直接粘貼到了xml文件中,而網(wǎng)上的代碼可能不符合xml規(guī)范


解決辦法:1.去掉xml文件中的中文注解,因?yàn)閺?fù)制的有些注解Spring不能識別。?

? ? ? ? ? ? ? ? ? 2.若仍然有錯(cuò),則嘗試修改多余的空格,因?yàn)橹形目崭馭pring有可能識別錯(cuò)誤。

? ? ? ? ? ? ? ? ? 3.最后的絕招:重新手動抄寫一遍文件內(nèi)容,保存。

參考博文:https://blog.csdn.net/mafan121/article/details/43266733


2.?在配置web.xml?文件中對配置的元素不是很熟悉:


????????可以看到,在配置Servlet時(shí),有兩個(gè)地方需要配置,一個(gè)是<servlet>,另一個(gè)是<servlet-Mapping>,這兩個(gè)一個(gè)是配置Servlet,一個(gè)是配置其映射信息,其中<servlet>中的<servlet-name>可以隨意指定,但要有一定的意義,一般取為類的名稱,例如我的類名為ServletDemo,這里取名為ServletDemo,下面的<servlet-class>是類的全路徑,package+classname,一定要是全路徑!

????????<servlet-Mapping>是映射信息,它也有一個(gè)<servlet-name>,里面的名字是對應(yīng)的Servlet名,也就是我們上面配置的Servlet名字,這里是ServletDemo,下面的是映射路徑,也就是訪問Servlet的名稱,這里也是以方便和有意義為前提的,是我們在訪問Servlet在瀏覽器地址欄后面輸入的那個(gè)信息,例如我的映射路徑命名為/servlet,在地址欄中輸入http://localhost:8080/servlet

注意:這里的映射路徑一定不能丟掉/,否則就會出錯(cuò)了一定要寫成/servlet,不能是servlet




參考博文:https://blog.csdn.net/m0_37630602/article/details/65443660

3.?

eclipse項(xiàng)目一直顯示有錯(cuò),但是一直找不到錯(cuò)誤在哪里

這天在寫項(xiàng)目的時(shí)候碰到了這么個(gè)問題,項(xiàng)目上一直提示著紅叉,但不管是文件里還是java buildpath里都找不到報(bào)錯(cuò),然后我就郁悶了。

后來給我找到一個(gè)解決方案,能查看當(dāng)前錯(cuò)誤是什么:?

eclipse–>Window–>show View–>Markers,出現(xiàn)一個(gè)面板,然后在這個(gè)面板里就能查看到底是什么在出錯(cuò)啦。

參考博文:https://blog.csdn.net/zhagzheguo/article/details/51660908

4.?

參考博文:http://lpcjrflsa.iteye.com/blog/1101796(Log4j日志文件輸出為相對路徑的解決方法

總結(jié)

以上是生活随笔為你收集整理的继上一篇博客--javaweb通过接口来实现多个文件压缩和下载(包括单文件下载,多文件批量下载)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲一卡二卡 | av 日韩 人妻 黑人 综合 无码 | 欧美国产日韩在线观看 | 国产精品无码影院 | 在线亚洲人成电影网站色www | 在线观看亚洲av每日更新 | 成人激情小视频 | 成人国产一区 | 久久人人爽人人爽人人片av免费 | 茄子av在线| 加勒比成人av | 韩国三级视频在线 | 亚洲熟妇中文字幕五十中出 | 人人干网站| 凹凸视频一区二区 | 国产一级影院 | 成人在线免费观看网站 | 亚洲无色| 黄色网一级片 | 亚洲日本国产 | 91精品国产一区二区三区香蕉 | 精品蜜桃一区二区三区 | 久久大香 | 美国av导航 | 欧美日性视频 | 亚洲一区动漫 | 性自由色xxxx免费视频 | 天天射天天拍 | 性高跟鞋xxxxhd人妖 | 欧美久久久久久久久久久久久久 | 欧美黄色免费看 | 葵司一区二区 | 欧美人与动牲交a欧美精品 欧美三级在线看 | 最近中文字幕在线中文高清版 | 欧美高清久久 | 玖玖精品在线 | 中文字幕久久久久 | 色狠狠一区 | 在线播放不卡av | 亚洲综合免费观看高清完整版在线 | 国产精品宾馆在线精品酒店 | 国内一级视频 | www日韩av| 三级性生活视频 | 福利视频99| 岛国av在线免费 | 亚洲av无码片一区二区三区 | 亚洲综合图 | 美女黄污网站 | 婷婷成人av | 亚洲天堂影院在线观看 | 成人羞羞免费 | 日日爱夜夜操 | 一二三四视频社区在线 | 黑人巨大精品欧美一区二区蜜桃 | 中文精品久久 | 国产一级片免费视频 | 亚洲成人看片 | 亚洲一区二区三区在线播放 | 夜夜嗨av禁果av粉嫩av懂色av | 日韩欧美一区二区三区 | 欧美丰满熟妇xxxx | 青娱网电信一区电信二区电信三区 | 狠狠干男人的天堂 | 欧美高清hd19| 亚洲网站视频 | 二区在线播放 | 成人午夜又粗又硬又大 | 亚洲精品国产精品乱码不卡 | 嫩模一区二区三区 | 国产真实生活伦对白 | 久久久久久一级片 | 欧美精品一二三区 | 性高潮久久久久久久 | 国产精品久久免费 | 亚洲五月综合 | 国产成人观看 | 久久久久久久人妻无码中文字幕爆 | 欧美狠狠爱 | 午夜免费视频 | 啪免费| 人禽高h交| 欧美色图19p | 久久精品波多野结衣 | 黄色大片免费观看视频 | 国产成人精品一区二区三区网站观看 | 能看毛片的网站 | 国产夫妻av | 毛片无码一区二区三区a片视频 | 免费色视频 | 中文字幕精品久久久久人妻红杏1 | 久久接色 | 国产又粗又猛又黄又爽 | 成人国产精品一区二区 | jizz日本女人 | 一女被多男玩喷潮视频 | 在线一区二区视频 | 自拍亚洲欧美 | 亚洲乱码日产精品bd在线观看 |