BDF2-UPLOADER模塊的依賴
<dependency>
<groupId>com.bstek.bdf2</groupId>
<artifactId>bdf2-uploader</artifactId>
<version>2.0.0</version>
</dependency>
注意
實(shí)際上,BDF2-JASPERREPORTS模塊就依賴BDF2-UPLOADER模塊,所以在之前我們介紹BDF2-JASPERREPORTS模塊中,在上傳jasper格式報表及相關(guān)資源,用的就是BDF2-UPLOADER模塊提供的上傳功能。
屬性名 | 類型 | 默認(rèn)值 | 描述 |
allowFileTypes | String | 空 | 允許用戶上傳哪些類型的文件,默認(rèn)為空,表示不限制類型。 |
allowMaxFileSize | int | 空 | 允許用戶上傳文件的最大尺寸,單位是byte,默認(rèn)為空,表示不限制尺寸。 |
caption | String | 空 | 上傳按鈕的標(biāo)題,如上圖當(dāng)中的“上傳測試”。 |
processor | String | 空 | 文件上傳到服務(wù)端時采用哪個文件上傳處理器來處理上傳的文件,默認(rèn)為空,表示采用ID為“Database”的文件上傳處理器,這個處理器的作用就是將文件上傳到服務(wù)器下某個目錄。 |
autoSubmit | boolean | true | 選擇好文件后是否自動上傳,默認(rèn)為true,表示選擇好文件組件會自動觸發(fā)上傳動作,如果設(shè)置為false,那么我們需要手工調(diào)用該組件的submit方法來執(zhí)行上傳動作。 |
事件名 | 描述 |
onSelect | 在選擇好一個文件,但還沒開始將文件上傳到服務(wù)端時觸發(fā)的事件,在這個事件當(dāng)中,我們可以通過其中提供的arg參數(shù)的filename屬性拿到選擇好的文件的文件名稱。 |
onSuccess | 文件上傳成功之后觸發(fā)的事件,從這個事件當(dāng)中的arg參數(shù)中,我們可以獲取到上傳成功之后文件的文件名(arg.filename),以及文件存儲后產(chǎn)生的id(arg.id),一般來說,對于我們的業(yè)務(wù)系統(tǒng),我們需要保存這個id ,通過這個id就可以找到上傳的文件,filename一般僅用于顯示。 |
onFail | 文件上傳失敗之后觸發(fā)的事件,從這個事件當(dāng)中的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 返回當(dāng)前處理器的ID
*/
String key();
/**
* @return 是否禁用當(dāng)前處理器
*/
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>
屬性名 | 類型 | 默認(rèn)值 | 描述 |
bdf2.upload.dataSourceName | String | 空 | BDF2-UPLOADER模塊要采用的數(shù)據(jù)源,為空表示采用默認(rèn)數(shù)據(jù)源。 |
bdf2.uploader.allowMaxFileSize | int | 0 | 允許上傳文件的最大尺寸,默認(rèn)為0表示不限制尺寸。該屬性可以在RichUploader組件使用時重新定義,一旦定義會覆蓋這個屬性定義的值,否則就采用這里定義的值。 |
bdf2.uploader.allowFileTypes | String | 空 | 允許上傳文件的類型,多個類型用逗號分隔,默認(rèn)為空表示不限制類型。該屬性可以在RichUploader組件使用時重新定義,一旦定義會覆蓋這個屬性定義的值,否則就采用這里定義的值。 |
bdf2.uploader.defaultProcessor | String | Database | 默認(rèn)要采用的文件上傳處理器,默認(rèn)為Database,表示上傳的文件存放于數(shù)據(jù)庫特定表中。該屬性可以在RichUploader組件使用時重新定義,一旦定義會覆蓋這個屬性定義的值,否則就采用這里定義的值。 |
bdf2.uploader.localDirectoryFileProcessorDirectory | String | uploadfiles | 如果采用LocalDirectory這個文件上傳處理器,那么該屬性就是定義文件上傳到服務(wù)端后該存放于哪個目錄下,默認(rèn)為uploadfiles,表示將存放到應(yīng)用所在目錄的WEB-INF/uploadfiles目錄下,如果我們需要指定其它目錄,那么需要定義一個真實(shí)存在的目錄,比如定義值為D:\myuploadfiles,那么就表示上傳的文件放存放于D盤下的myuploadfiles目錄中。 |
bdf2.uploader.localDirectoryFileProcessorStorageMethod | String | month | 文件存儲在目錄中時,子目錄的定義方式,這里支持三個值:year、month、day,分別表示按年、按年\月及按年\月\日這三種格式來劃分目錄存放上傳文件。默認(rèn)為month,表示按年\月格式劃分目錄存放上傳文件。 |
bdf2.uploader.localDirectoryFileProcessorFileNameStorageMethod | String | uuid | 上傳后文件命名方式,這里支持三種格式:hybrid、uuid及realName。hybrid表示文件在命名是將uuid+文件名這種混合方式命名;uuid則將直接采用uuid命名文件;而realName只是采用文件真實(shí)名稱。 |
bdf2.uploader.disableDatabaseFileProcessor | boolean | false | 是否禁用Database方式文件處理器,一旦禁用,運(yùn)行時將不能使用。 |
bdf2.uploader.disableLocalDirectoryFileProcessor | boolean | false | 是否禁用LocalDirectory方式文件處理器,一旦禁用,運(yùn)行時將不能使用。 |
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ù)接口,對外提供二進(jìn)制數(shù)據(jù),超長文本等的儲存、更新、取出等操作。
* <p>
* 這里的操作分為兩組:<br/>
* <ol>
*
<li>byte及binaryStream相關(guān)的為第一組,代表了對二進(jì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ù)清理,以免造成空間的浪費(fèi)。<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;
/**
* 保存一個二進(jìn)制數(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;
/**
* 保存一個二進(jìn)制數(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)容的二進(jìn)制輸入流
* @param contentLength
* 二進(jìn)制輸入流的長度
* @throws SQLException
*
在更新數(shù)據(jù)庫中的記錄時可能拋出此異常;此外,如果更新不成功,如與主鍵對應(yīng)的記錄不存在,也拋出此異常。;
*/
void updateBinaryStream(String id, InputStream inputStream,
int contentLength) throws SQLException;
/**
* 根據(jù)主鍵取得內(nèi)容的二進(jìn)制輸入流,若未找到,返回<code>null</code>。
*
* @param id
* 需要查詢的內(nèi)容的主鍵
* @return 代表內(nèi)容的二進(jìn)制輸入流
* @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";
}
更多建議: