1. 程式人生 > >Jar包中的檔案下載(web層框架-Restlet)

Jar包中的檔案下載(web層框架-Restlet)

以前沒有寫部落格的習慣,今天開始把工作遇到的問題和總結的經驗做個記錄

  • 問題描述,可忽略
    專案是模型驅動架構,可以針對不同客戶需求以配置檔案的方式將不同的模組拼接到一起構建成一個完整的專案,今天為uam(模組名)寫了一個簡單的批量匯入功能,需要從伺服器下載模板提供給客戶,問題是整個專案只有一個war包,各種功能模組都通過maven以jar包的形式整合,因為該模板不是通用模板,要求從war包的專案中拆出來,放到相應模組打進jar包,這樣一來就無法通過new File(path)這種方式獲取
  • 解決思路
    先貼一段原來通用下載程式的程式碼
//各種校驗程式碼已省略,web層框架為Restlet
public class ExportDocumentResource extends AbstractResource { @Get public Representation getResourceXls() { try { //獲取url中引數map Map<String, Object> attributes = getAttribute(); //獲取檔案路徑引數 String moduleName = (String) attributes.get("moduleName"
); //獲取檔名 String fileName = (String) attributes.get("fileName"); //獲取副檔名 String extensionName = (String) attributes.get("extensionName"); //拼接檔案相對路徑 String attachPath = "此處是寫死的war包專案根路徑" + moduleName + "/"; //建立檔案物件 File file = new
File(attachPath + fileName + extensionName); //return一個FileRepresentation物件,裡面封裝了file Representation r = new FileRepresentation(file, MediaType.APPLICATION_ALL); //省略一堆FileRepresentation的Api return r; } catch (Exception e) { e.printStackTrace(); } return null; } }

上面這個方法是各模組通用的,為了是降低程式碼冗餘,需要沿用該方法,在引數和返回值不變的情況下進行程式碼增強,但可以肯定的是通過具體路徑無法拿到對應的jar包中的檔案,jar包是檔案,不是資料夾,沒有路徑肯定不存在File的物件,返回值型別不能為FileRepresentation,思考到這裡正向走不通,倒推一下,檔案下載實質是是服務端向客戶端輸出一個io流,查了一下Api,Representation的子類中有InputRepresentation可供選擇,直接傳一個流過去,這樣返回值型別就確定了,接下來只要拿到輸入流即可,jar包編譯之後也都是.class位元組碼檔案,jvm能拿到這些東西也是通過類的載入器,順著這個思路也用類的載入器來獲取jar包中指定檔案,不要路徑名,換成全類名即可,囉嗦了這麼多,下面貼上程式碼來實現

//各種校驗程式碼已省略
public class ExportDocumentResource extends AbstractResource {
    @Get
    public Representation getResourceXls() {
        try {
            Map<String, Object> attributes = getAttribute();
            String moduleName = (String) attributes.get("moduleName");
            String fileName = (String) attributes.get("fileName");
            String extensionName = (String) attributes.get("extensionName");
            String attachPath = "此處是寫死的war包專案根路徑" + moduleName + "/";
            //以上不變,在url中增加一個basepath鍵值對 basepath=com.xxx.xxx.檔名.xls
            String basePath = (String) attributes.get("basePath");
            //為保證原有功能可用,增加if判斷分別處理兩種請求
            Representation r = null;
            if (basePath != null && !basePath.equals("")) {// 讀取jar包中的資原始檔
                //拼接全類名
                attachPath = "/" + basePath.replace(".", "/") + "/";
                //用類載入器獲取jar包中檔案的輸入流
                InputStream is = this.getClass().getResourceAsStream(attachPath + fileName + extensionName);
                r = new InputRepresentation(is);//省略一堆InputRepresentation的Api
            } else {// 讀取專案路徑資原始檔
                File file = new File(attachPath + fileName + extensionName);
                r = new FileRepresentation(file, MediaType.APPLICATION_ALL);//省略一堆FileRepresentation的Api    
            }
            return r;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

至此在不增加方法,不改變原有功能的前提下,jar包中的資源也可以被順利下載

相關推薦

Jar檔案下載(web框架-Restlet)

以前沒有寫部落格的習慣,今天開始把工作遇到的問題和總結的經驗做個記錄 問題描述,可忽略 專案是模型驅動架構,可以針對不同客戶需求以配置檔案的方式將不同的模組拼接到一起構建成一個完整的專案,今天為uam(模組名)寫了一個簡單的批量匯入功能,需要從伺服器下載模

打包後jar檔案讀取問題

1、jar包中原來的資料夾被打包放到工程中,資料夾會變成包package 2、讀取jar包中的檔案,必須使用ClassLoader.getResource(fileName) 或者 ClassLoader.getResourceAsStream(fileName)去獲取 3

ideamaven專案遇到pom檔案jar不能下載解決方式

在做graphframes開發過程中遇到pom檔案不能下載:<!-- https://mvnrepository.com/artifact/graphframes/graphframes --><dependency>    <groupId&g

Web框架對網站所有異常的統一處理

配置文件 數據安全 攔截器 網站 如何 一個網站的異常信息作為專業的人士,是不會輕易暴露給用戶的,因為那樣狠不安全,顯得你漏是一回事,只要還是考慮到網站的數據安全問題,下面給大家分享一下一些常見的web層框架是如何處理統一的異常。   之前都是在Struts2的配置文件中配置攔截器

SpringBoot 使引用jar的配置檔案生效

場景: 一個由多模組構成的spring boot maven專案,有A,B,C三個子專案,也就是三個jar包,其中A中寫了資料庫底層mapper,所以被B和C中引用。 問題: 為了方便,資料庫的配置想直接寫在A模組中的yaml檔案中,這樣在B/C模組中的yaml檔案中就不必再寫資料庫連線資訊了

Spring boot 讀取jarresources下的檔案

package com.jiankunking.elasticsearch.extension.util; import org.springframework.core.io.DefaultResourceLoader; import org.springframework.core

修改jarclass檔案

某日,想要更改jar包中的某個class檔案,有無rar無法解壓jar檔案,故找到如下方式進行操作 1、解壓某個jar包:在需要解壓的jar包目錄下,開啟命令列(cmd),輸入如下命令,輸入:C:\jar>jar xf lm.jar 沒有任何反應就表示解壓成功。 2、反編譯class檔案,相同路徑新

JAR的MANIFEST.MF檔案詳解以及編寫規範

JAR包中的MANIFEST.MF檔案詳解以及編寫規範 參考百度百科的解釋如下: http://baike.baidu.com/item/MANIFEST.MF MANIFEST.MF:這個 manifest 檔案定義了與擴充套件和包相關的資料。單詞“manifest”的意思是“

SpringBoot實踐-匯入jar的配置檔案

事件起因:開發的專案需要依賴一個本地jar包,無法通過maven直接下載;而這個jar包中含有配置檔案,在配置檔案中定義了spring的bean,而我的專案需要用到這個bean。 開發工具:IDEA JDK版本:1.7 使用框架:SpringBoot、SpringMVC 解決過程

java 讀取jar檔案

參考: https://blog.csdn.net/rchm8519/article/details/39557499 參考: https://www.cnblogs.com/zeciiii/p/4178824.html  需求: 我自己寫了一個Java 的記事本工具,然後實現

ResourceUtils.getFile 獲取檔案 獲取jar的資原始檔

摘要:通過Spring工具類獲取classpath下的檔案資源;獲取jar包中的資原始檔 1. web專案下classpath檔案獲取   方法(1)File resourcefile = ResourceUtils.getFile("classpath:applicat

jar檔案找不到對應的地址的解決方法

對於本地的地址,測試時可以。一上到服務環境,就報錯,,xml的檔案地址找不到。於是也找了好多網上的方式解決,但始終解決不了。於是在一次偶然機會,找到了一種方式,反射流的方式。解決。 InputStream inputStream = ClassUtils.class.getResourceAs

修改jar的配置檔案

打包以及修改jar包 cd genesys_data_etl mvn clean package -Poffline -Dmaven.test.skip=true 日誌如下: [INFO] --- maven-jar-plugin:2.6:jar (default-jar) @ genesys_

java實現:對jar的配置檔案修改

注:只修改檔案,其他會被清空  package com.mtpc.admin.util; import java.io.*; import java.util.*; import java.util.jar.JarEntry; import java.util.jar.J

Linux修改jar的配置檔案

打包以及修改jar包 cd genesys_data_etl mvn clean package -Poffline -Dmaven.test.skip=true 日誌如下: [INFO] --- maven-jar-plugin:2.6:jar (default-jar

檢視與修改位元組碼,從而實現替換他人jarclass檔案的目的

一、檢視二進位制位元組碼檔案的方式: 1.通過cmd命令:javap -v ClassA 2.通過jclasslib工具 二、將Android的apk中的dex反編成smail檔案,直接修改smail檔案後再回編成dex; 三、修改二進位制位元組碼檔案的方式: 1.反編

查詢jar檔案

find external libraries’ file agaist the text content. if the file contains the search text content, get it out. 呵呵,看第三方SDK,常常會需要

SSH常用web專案.jar彙總及下載

SSH框架:Struts2.1.6、hibernate3.3.2、spring2.5.6可以下載相應的檔案,其中含有jar包 Struts 2需要的jar包:1.commons-fileuplo

如何修改jar的class檔案

1、把X.jar包中的class用jd-gui、luyten反編譯得到原始碼xxx.Java 2、javac -cp A.jar;B.jar;C.jar xxx.java 得到修改後的xxx.class檔案 (其中A、B、C是依賴jar包,一般直接依賴一個原始解壓的X.

eclipse 如何除錯jar的.class檔案

        最近,換了個專案組,因為專案組中的基線程式碼(打包成jar的程式碼)看不到,用jd-gui可以反編譯,但是除錯遇到了麻煩。因為行數和程式碼不對應。弄了半個下午,試了很多方法,比如Eclipse Class Decompiler(但是部分jar包可以反編譯成j