本文說的是把圖片上傳到數據庫中的Blob類型,從數據庫中取出來並顯示的問題。框架是基於spring和mybatis的
首先環境配置,如果項目中有圖片上傳的功能。那么需要對應的JAR和相關配置。
1、commons-fileupload-1.2.2.jar
2、commons-io-2.0.1.jar
要實現SpringMVC的文件上傳,需要配置一下文件:
其次,需要說明的是有圖片上傳提交的表單和沒有圖片上傳提交的表單是不一樣的。有圖片上傳的表單需要在form的設置中添加enctype="multipart/form-data"。例如: 。原因是enctype="multipart/form-data"的意思,是設置表單的MIME編碼。默認情況,這個編碼格式是application/x-www-form-urlencoded,不能用於文件上傳;只有使用了multipart/form-data,才能完整的傳遞文件數據,進行下面的操作. enctype="multipart/form-data"是上傳二進制數據; form里面的input的值以2進制的方式傳過去,所以request就得不到值了。 也就是說加了這段代碼,用request就會傳遞不成功。
當然文件上傳的JSP設置參照類型設置成file,自動就有參照按鈕(不是所有,待定)了。
然后,先說上傳圖片,基本思路是把獲得的文件轉換成byte[]型然后存入數據庫中。關於fle類型到byte[]型的轉換,下面貼一下工具方法。需要用的可以直接復制。
public byte[] getBytes(File file){
byte[] buffer = null;
if (file == null){
return buffer;
} else {
try {
FileInputStream fis = new FileInputStream(file);
ByteArrayOutputStream bos = new ByteArrayOutputStream(1000);
byte[] b = new byte[1000];
int n;
while ((n = fis.read(b)) != -1) {
bos.write(b, 0, n);
}
fis.close();
bos.close();
buffer = bos.toByteArray();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
return buffer;
}
由於mysql數據庫中中Blob類型的字段其實就是二進制數據,所以可以當成是byte[].也就是表對應的Entity里的該字段的類型設為byte[]數組是沒有任何問題。
之后貼一下mybatis的XML的SQL(說明一下,此處要提交的圖片名稱為logo)
update mcompany
set name = #{name,jdbcType=VARCHAR},
shortname = #{shortname,jdbcType=VARCHAR},
email = #{email,jdbcType=VARCHAR},
adress = #{adress,jdbcType=VARCHAR},
logo = #{logo,jdbcType=LONGVARBINARY},
where code = #{code,jdbcType=VARCHAR}
另外,由於本人在控制器里取表單傳過來的文件的時候花了點時間,所以在此貼一下代碼
@RequestMapping(value = "/save")
public String saveMyComDisplay(McompanyForm mcompanyForm,
@RequestParam("uploadfile") CommonsMultipartFile file) {
byte[] logoBytes = null;
if (!file.isEmpty()) {
try {
logoBytes = file.getBytes();
BufferedOutputStream stream =
new BufferedOutputStream(new FileOutputStream(new File("-uploaded")));
stream.write(logoBytes);
stream.close();
}catch (Exception e) {
return "You failed to upload => " + e.getMessage();
}
}
.......................此處省略.................................
}
其實圖片上傳還可以傳到服務器的固定目錄上,在數據庫中保存的是圖片地址。對於當個的小圖片直接轉換為二進制存在數據庫中個人認為比較合適。
下面再來說圖片顯示的問題。基本思路是從數據庫中取出該圖片的byte[],之后轉換成File類型的文件並保存到一個相對路徑下的臨時文件夾里面。JSP從該目錄下面讀取就可以了。
也貼一下byte[]轉換為文件類型的工具方法,方便大家復制。
public static void byteToFile(byte[] buf, String filePath, String fileName)
{
BufferedOutputStream bufferOut = null;
FileOutputStream fileOut = null;
File file = null;
try
{
File resFile = new File(filePath);
if (!resFile.exists() && resFile.isDirectory())
{
resFile.mkdirs();
}
file = new File(filePath + File.separator + fileName);
fileOut = new FileOutputStream(file);
bufferOut = new BufferedOutputStream(fileOut);
bufferOut.write(buf);
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
if (bufferOut != null)
{
try
{
bufferOut.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
if (fileOut != null)
{
try
{
fileOut.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
}
注意這個方法的目的是在你指定的目錄下面新建將數據庫存的Blob類型的轉換后的一個文件。無返回值。其中參數新建文件的路徑,一般情況下為相對路徑。
最后貼一下JSP中顯示圖片的代碼
總得來說,這是圖片上傳比較基本的方法,不適用於上傳大批量文件的情況。