BDF2-UPLOADER模塊的依賴
<dependency> <groupId>com.bstek.bdf2</groupId> <artifactId>bdf2-uploader</artifactId> <version>2.0.0</version> </dependency>
注意
實際上,BDF2-JASPERREPORTS模塊就依賴BDF2-UPLOADER模塊,所以在之前我們介紹BDF2-JASPERREPORTS模塊中,在上傳jasper格式報表及相關(guān)資源,用的就是BDF2-UPLOADER模塊提供的上傳功能。
屬性名 | 類型 | 默認值 | 描述 |
allowFileTypes | String | 空 | 允許用戶上傳哪些類型的文件,默認為空,表示不限制類型。 |
allowMaxFileSize | int | 空 | 允許用戶上傳文件的最大尺寸,單位是byte,默認為空,表示不限制尺寸。 |
caption | String | 空 | 上傳按鈕的標題,如上圖當中的“上傳測試”。 |
processor | String | 空 | 文件上傳到服務(wù)端時采用哪個文件上傳處理器來處理上傳的文件,默認為空,表示采用ID為“Database”的文件上傳處理器,這個處理器的作用就是將文件上傳到服務(wù)器下某個目錄。 |
autoSubmit | boolean | true | 選擇好文件后是否自動上傳,默認為true,表示選擇好文件組件會自動觸發(fā)上傳動作,如果設(shè)置為false,那么我們需要手工調(diào)用該組件的submit方法來執(zhí)行上傳動作。 |
事件名 | 描述 |
onSelect | 在選擇好一個文件,但還沒開始將文件上傳到服務(wù)端時觸發(fā)的事件,在這個事件當中,我們可以通過其中提供的arg參數(shù)的filename屬性拿到選擇好的文件的文件名稱。 |
onSuccess | 文件上傳成功之后觸發(fā)的事件,從這個事件當中的arg參數(shù)中,我們可以獲取到上傳成功之后文件的文件名(arg.filename),以及文件存儲后產(chǎn)生的id(arg.id),一般來說,對于我們的業(yè)務(wù)系統(tǒng),我們需要保存這個id ,通過這個id就可以找到上傳的文件,filename一般僅用于顯示。 |
onFail | 文件上傳失敗之后觸發(fā)的事件,從這個事件當中的arg參數(shù)中,我們可以獲取到上傳失敗的錯誤消息(arg.errorMessage),比如上傳文件類型不對,文件尺寸太大,或其它的錯誤消息等。 |
IFileProcessor接口源碼
package com.bstek.bdf2.uploader.processor;
import java.io.InputStream;
import com.bstek.bdf2.uploader.model.UploadDefinition;
/**
* @author Jacky.gao
* @since 2013-5-1
*/
public interface IFileProcessor {
/**
* 保存上傳的文件
* @param uploadDefinition 可以從這個對象中取到上傳文件的ID、名稱、大小等信息
* @param inputStream 上傳文件的流對象
*/
void saveFile(UploadDefinition uploadDefinition,InputStream inputStream);
/**
* 根據(jù)給出的文件上傳對象,返回對應(yīng)的文件流
* @param uploadDefinition 文件上傳對象
* @return 要取回的文件流
*/
InputStream loadFile(UploadDefinition uploadDefinition);
/**
* 根據(jù)文件上傳對象,刪除對應(yīng)的文件
* @param uploadDefinition 文件上傳對象
*/
void deleteFile(UploadDefinition uploadDefinition);
/**
* @return 返回當前處理器的ID
*/
String key();
/**
* @return 是否禁用當前處理器
*/
boolean isDisabled();
}
Database文件上傳處理器
package com.bstek.bdf2.uploader.processor.impl;
import java.io.InputStream;
import com.bstek.bdf2.uploader.model.UploadDefinition;
import com.bstek.bdf2.uploader.processor.IFileProcessor;
import com.bstek.bdf2.uploader.service.ILobStoreService;
/**
* @author Jacky.gao
* @since 2013-5-20
*/
public class DatabaseFileProcessor implements IFileProcessor {
private boolean disabled;
private ILobStoreService lobStoreService;
public void saveFile(UploadDefinition uploadDefinition,InputStream inputStream) {
try {
lobStoreService.storeBinaryStream(inputStream, inputStream.available(),uploadDefinition.getId());
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public InputStream loadFile(UploadDefinition uploadDefinition) {
try {
return lobStoreService.getBinaryStream(uploadDefinition.getId());
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public void deleteFile(UploadDefinition uploadDefinition) {
try {
lobStoreService.deleteBinaryStream(uploadDefinition.getId());
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public String key() {
return "Database";
}
public boolean isDisabled() {
return disabled;
}
......
}
<contextPath>/dorado/bdf2/uploader/process.download?id=<通過RichUploader上傳文件成功后拿到的文件的id>
<contextPath>/dorado/bdf2/uploader/process.display?id=<通過RichUploader上傳文件成功后拿到的文件的id>
屬性名 | 類型 | 默認值 | 描述 |
bdf2.upload.dataSourceName | String | 空 | BDF2-UPLOADER模塊要采用的數(shù)據(jù)源,為空表示采用默認數(shù)據(jù)源。 |
bdf2.uploader.allowMaxFileSize | int | 0 | 允許上傳文件的最大尺寸,默認為0表示不限制尺寸。該屬性可以在RichUploader組件使用時重新定義,一旦定義會覆蓋這個屬性定義的值,否則就采用這里定義的值。 |
bdf2.uploader.allowFileTypes | String | 空 | 允許上傳文件的類型,多個類型用逗號分隔,默認為空表示不限制類型。該屬性可以在RichUploader組件使用時重新定義,一旦定義會覆蓋這個屬性定義的值,否則就采用這里定義的值。 |
bdf2.uploader.defaultProcessor | String | Database | 默認要采用的文件上傳處理器,默認為Database,表示上傳的文件存放于數(shù)據(jù)庫特定表中。該屬性可以在RichUploader組件使用時重新定義,一旦定義會覆蓋這個屬性定義的值,否則就采用這里定義的值。 |
bdf2.uploader.localDirectoryFileProcessorDirectory | String | uploadfiles | 如果采用LocalDirectory這個文件上傳處理器,那么該屬性就是定義文件上傳到服務(wù)端后該存放于哪個目錄下,默認為uploadfiles,表示將存放到應(yīng)用所在目錄的WEB-INF/uploadfiles目錄下,如果我們需要指定其它目錄,那么需要定義一個真實存在的目錄,比如定義值為D:\myuploadfiles,那么就表示上傳的文件放存放于D盤下的myuploadfiles目錄中。 |
bdf2.uploader.localDirectoryFileProcessorStorageMethod | String | month | 文件存儲在目錄中時,子目錄的定義方式,這里支持三個值:year、month、day,分別表示按年、按年\月及按年\月\日這三種格式來劃分目錄存放上傳文件。默認為month,表示按年\月格式劃分目錄存放上傳文件。 |
bdf2.uploader.localDirectoryFileProcessorFileNameStorageMethod | String | uuid | 上傳后文件命名方式,這里支持三種格式:hybrid、uuid及realName。hybrid表示文件在命名是將uuid+文件名這種混合方式命名;uuid則將直接采用uuid命名文件;而realName只是采用文件真實名稱。 |
bdf2.uploader.disableDatabaseFileProcessor | boolean | false | 是否禁用Database方式文件處理器,一旦禁用,運行時將不能使用。 |
bdf2.uploader.disableLocalDirectoryFileProcessor | boolean | false | 是否禁用LocalDirectory方式文件處理器,一旦禁用,運行時將不能使用。 |
IFileService源碼
package com.bstek.bdf2.uploader.service; import java.io.InputStream; import com.bstek.bdf2.uploader.model.UploadDefinition; /** * @author Jacky.gao * @since 2013-5-12 */ public interface IFileService { public static final String BEAN_ID="bdf2.uploader.fileService"; UploadDefinition getUploadDefinition(String id); InputStream getFile(UploadDefinition definition); InputStream getFile(String id); void deleteUploadDefinition(String id); }
ILobStoreService接口源碼
package com.bstek.bdf2.uploader.service; import java.io.InputStream; import java.io.Reader; import java.sql.SQLException; /** * 大對象倉庫服務(wù)接口,對外提供二進制數(shù)據(jù),超長文本等的儲存、更新、取出等操作。 * <p> * 這里的操作分為兩組:<br/> * <ol> * <li>byte及binaryStream相關(guān)的為第一組,代表了對二進制數(shù)據(jù),如圖片、聲音、視頻等的操作,在數(shù)據(jù)庫中通常以B LOB或IMAGE類型表示</li> * <li>string、asciiString及characterStream相關(guān)的為第二組,代表了對大文本對象,如文本文件、新聞公告等的操作 , * 在數(shù)據(jù)庫中通常以CLOB或TEXT類型表示</li> * </ol> * 需要注意的是,不管為哪種類型的大對象,倉庫中均不允許其內(nèi)容為空, 若業(yè)務(wù)數(shù)據(jù)允許引用一個空對象,請將業(yè)務(wù)表中的允許為空的記錄的相關(guān)字段設(shè)置為NULL。<br/> * 對于不再需要的大對象,請及時使用delete*函數(shù)清理,以免造成空間的浪費。<br/> * 此接口中的所有函數(shù)均不能保證一定能完成指定的操作,請在使用時處理拋出的異常<br/> * </p> * @author jacky.gao@bstek.com * @since 2.0 */ public interface ILobStoreService { /** * 保存一個byte數(shù)組,并返回它在倉庫中的主鍵。 * * @param content * 需要保存的內(nèi)容,不能為空 * @return 保存后的內(nèi)容在倉庫中的主鍵,稍后可通過{@link #getBytes(String)}取得倉庫中的內(nèi)容 * @throws SQLException * 將byte數(shù)組保存到數(shù)據(jù)庫時可能拋出此異常 */ String storeBytes(byte[] content) throws SQLException; /** * 保存一個byte數(shù)組,并返回它在倉庫中的主鍵。 * @param content 需要保存的內(nèi)容,不能為空 * @param id 需要保存的內(nèi)容的ID * @throws SQLException * 將byte數(shù)組保存到數(shù)據(jù)庫時可能拋出此異常 */ void storeBytes(byte[] content,String id) throws SQLException; /** * 根據(jù)內(nèi)容在倉庫中的主鍵,刪除對應(yīng)的記錄。 * * @param id * 需要刪除的內(nèi)容在倉庫中的主鍵 * @throws SQLException * 在從數(shù)據(jù)庫中刪除數(shù)據(jù)時可能拋出此異常; 此外,如果刪除不成功,如與主鍵對應(yīng)的記錄不存在,也拋出此異常。 */ void deleteBytes(String id) throws SQLException; /** * 更新主鍵所指的內(nèi)容。 * <p> * 保證此內(nèi)容的名稱<font color="red">不</font>變。 * </p> * * @param id * 需要被更新的內(nèi)容的主鍵 * @param content * 新的值 * @throws SQLException * 在更新數(shù)據(jù)庫的過程中可能拋出此異常;此外,如果更新不成功,如與主鍵對應(yīng)的記錄不存在,也拋出此異常。 */ void updateBytes(String id, byte[] content) throws SQLException; /** * 根據(jù)主鍵查詢內(nèi)容,若未找到,返回<code>null</code>。 * * @param id * 內(nèi)容的主鍵,通常由業(yè)務(wù)記錄中的某一字段保有 * @return 與主鍵相對應(yīng)的內(nèi)容 * @throws SQLException * 在查詢數(shù)據(jù)庫的過程中可能拋出此異常。 */ byte[] getBytes(String id) throws SQLException; /** * 保存一個二進制數(shù)據(jù)流中的數(shù)據(jù),并返回其在倉庫中的主鍵。 * * @param inputStream * 需要保存的內(nèi)容,不能為空 * @param contentLength * 內(nèi)容的長度。如若保存一個{@link java.io.File}對象,則通常此長度由 * {@link java.io.File#length}取得 * @return 保存后的內(nèi)容在倉庫中的主鍵,稍后可通過{@link #getBinaryStream(String)}取得倉庫中的內(nèi)容 * @throws SQLException */ String storeBinaryStream(InputStream inputStream, int contentLength) throws SQLException; /** * 保存一個二進制數(shù)據(jù)流中的數(shù)據(jù),并返回其在倉庫中的主鍵。 * * @param inputStream * 需要保存的內(nèi)容,不能為空 * @param contentLength * 內(nèi)容的長度。如若保存一個{@link java.io.File}對象,則通常此長度由 * {@link java.io.File#length}取得 * @param id * 需要保存的內(nèi)容ID * @throws SQLException */ void storeBinaryStream(InputStream inputStream, int contentLength,String id) throws SQLException; /** * 根據(jù)內(nèi)容在倉庫中的主鍵,刪除對應(yīng)的記錄。 * * @param id * 需要被刪除的內(nèi)容的主鍵 * @throws SQLException * 在刪除數(shù)據(jù)庫中的記錄時可能拋出此異常;此外,如果刪除不成功,如與主鍵對應(yīng)的記錄不存在,也拋出此異常。 */ void deleteBinaryStream(String id) throws SQLException; /** * 更新指定主鍵代表的內(nèi)容。 * <p> * 保證此內(nèi)容的名稱<font color="red">不</font>變。 * </p> * * @param id * 需要被更新的內(nèi)容的主鍵 * @param inputStream * 用于更新內(nèi)容的二進制輸入流 * @param contentLength * 二進制輸入流的長度 * @throws SQLException * 在更新數(shù)據(jù)庫中的記錄時可能拋出此異常;此外,如果更新不成功,如與主鍵對應(yīng)的記錄不存在,也拋出此異常。; */ void updateBinaryStream(String id, InputStream inputStream, int contentLength) throws SQLException; /** * 根據(jù)主鍵取得內(nèi)容的二進制輸入流,若未找到,返回<code>null</code>。 * * @param id * 需要查詢的內(nèi)容的主鍵 * @return 代表內(nèi)容的二進制輸入流 * @throws SQLException * 在查詢數(shù)據(jù)庫的過程中可能拋出此異常 */ InputStream getBinaryStream(String id) throws SQLException; /** * 保存一個超長的字符串,并返回其在倉庫中的主鍵。 * * @param content * 需要保存的內(nèi)容。 * @return 保存后的內(nèi)容在倉庫中的主鍵,稍后可通過{@link #getString(String)}取得倉庫中的內(nèi)容 * @throws SQLException * 在將內(nèi)容保存到數(shù)據(jù)庫的過程中可能拋出此異常。 */ String storeString(String content) throws SQLException; /** * 保存一個超長的字符串,并返回其在倉庫中的主鍵。 * * @param content 需要保存的內(nèi)容。 * @param id 需要保存的內(nèi)容ID。 * @throws SQLException * 在將內(nèi)容保存到數(shù)據(jù)庫的過程中可能拋出此異常。 */ void storeString(String content,String id) throws SQLException; /** * 根據(jù)內(nèi)容在倉庫中的主鍵刪除對應(yīng)的記錄。 * * @param id * 需要刪除的內(nèi)容在倉庫中的主鍵 * @throws SQLException * 在從數(shù)據(jù)庫中刪除記錄時可能拋出此異常;此外,如果刪除不成功,如與主鍵對應(yīng)的記錄不存在,也拋出此異常。; */ void deleteString(String id) throws SQLException; /** * 更新指定的主鍵代表的內(nèi)容。 * * @param id * 需要更新的內(nèi)容的主鍵 * @param content * 用于更新的值 * @throws SQLException * 在更新數(shù)據(jù)庫中的記錄時可能拋出此異常;此外,如果更新不成功,如與主鍵對應(yīng)的記錄不存在,也拋出此異常。 */ void updateString(String id, String content) throws SQLException; /** * 根據(jù)主鍵查詢其在倉庫中的內(nèi)容,若未找到,返回<code>null</code>。 * * @param id * 需要查詢的內(nèi)容的主鍵 * @return 代表查詢內(nèi)容的字符串 * @throws SQLException * 在查詢數(shù)據(jù)庫的過程中可能拋出此異常 */ String getString(String id) throws SQLException; /** * 保存一個字節(jié)流,并返回其在倉庫中的主鍵。 * * @param asciiSrteam * 需要保存到倉庫中的字節(jié)流。 * @param contentLength * 字節(jié)流的長度。 * @return 保存后的內(nèi)容在倉庫中的主鍵,稍后可通過{@link #getAsciiStream(String)}取得倉庫中的內(nèi)容 * @throws SQLException * 在將內(nèi)容保存到數(shù)據(jù)庫的過程中可能拋出此異常。 */ String storeAsciiStream(InputStream asciiSrteam, int contentLength) throws SQLException; /** * 保存一個字節(jié)流,并返回其在倉庫中的主鍵。 * * @param asciiSrteam * 需要保存到倉庫中的字節(jié)流。 * @param contentLength * 字節(jié)流的長度。 * @param id 保存的ID * @throws SQLException * 在將內(nèi)容保存到數(shù)據(jù)庫的過程中可能拋出此異常。 */ void storeAsciiStream(InputStream asciiSrteam, int contentLength,String id) throws SQLException; /** * 根據(jù)內(nèi)容在倉庫中的主鍵刪除對應(yīng)的記錄。 * * @param id * 需要刪除的內(nèi)容在倉庫中的主鍵 * @throws SQLException * 在從數(shù)據(jù)庫中刪除記錄時可能拋出此異常;此外,如果刪除不成功,如與主鍵對應(yīng)的記錄不存在,也拋出此異常。; */ void deleteAsciiStream(String id) throws SQLException; /** * 更新指定的主鍵代表的內(nèi)容。 * * @param id * 需要更新的內(nèi)容的主鍵 * @param asciiStream * 用于更新的字節(jié)流 * @param contentLength * 字節(jié)流的長度 * @throws SQLException * 在更新數(shù)據(jù)庫中的記錄時可能拋出此異常;此外,如果更新不成功,如與主鍵對應(yīng)的記錄不存在,也拋出此異常。; */ void updateAsciiStream(String id, InputStream asciiStream, 115 int contentLength) throws SQLException; /** * 根據(jù)主鍵查詢其在倉庫中的內(nèi)容,若未找到,返回<code>null</code>。 * * @param id * 需要查詢的內(nèi)容的主鍵 * @return 代表內(nèi)容的字節(jié)流 * @throws SQLException * 在查詢數(shù)據(jù)庫的過程中可能拋出此異常 */ InputStream getAsciiStream(String id) throws SQLException; /** * 保存一個字符流,并返回其在倉庫中的主鍵。 * * @param reader * 需要保存的字符流 * @param contentLength * 字符流的長度 * @return 保存后的內(nèi)容在倉庫中的主鍵,稍后可通過{@link #getCharacterStream(String)}取得倉庫中的內(nèi)容 * @throws SQLException * 在將內(nèi)容保存到數(shù)據(jù)庫的過程中可能拋出此異常。 */ String storeCharacterStream(Reader reader, int contentLength) throws SQLException; /** * 保存一個字符流,并返回其在倉庫中的主鍵。 * * @param reader * 需要保存的字符流 * @param contentLength * 字符流的長度 * @param reader * 需要保存的字符流ID * @throws SQLException * 在將內(nèi)容保存到數(shù)據(jù)庫的過程中可能拋出此異常。 */ void storeCharacterStream(Reader reader, int contentLength,String id) throws SQLException; /** * 根據(jù)內(nèi)容在倉庫中的主鍵刪除對應(yīng)的記錄。 * * @param id * 需要刪除的內(nèi)容在倉庫中的主鍵 * @throws SQLException * 在從數(shù)據(jù)庫中刪除記錄時可能拋出此異常;此外,如果刪除不成功,如與主鍵對應(yīng)的記錄不存在,也拋出此異常。; */ void deleteCharacterStream(String id) throws SQLException; /** * 更新指定的主鍵代表的內(nèi)容。 * * @param id * 需要更新的內(nèi)容的主鍵 * @param reader * 用于更新的字符流 * @param contentLength * 字符流的長度 * @throws SQLException * 在更新數(shù)據(jù)庫中的記錄時可能拋出此異常;此外,如果更新不成功,如與主鍵對應(yīng)的記錄不存在,也拋出此異常。; */ void updateCharacterStream(String id, Reader reader, int contentLength) throws SQLException; /** * 根據(jù)主鍵查詢其在倉庫中的內(nèi)容,若未找到,返回<code>null</code>。 * * @param id * 需要查詢的內(nèi)容的主鍵 * @return 代表內(nèi)容的字符流 * @throws SQLException * 在查詢數(shù)據(jù)庫的過程中可能拋出此異常 */ Reader getCharacterStream(String id) throws SQLException; /** * 服務(wù)ID,代表了其在spring中的beanName。 */ public static final String BEAN_ID = "bdf2.lobStoreService"; }
更多建議: