PostgreSQL儲存檔案到資料庫
阿新 • • 發佈:2018-12-31
1.建立表
CREATE TABLE public.t_file (
id INTEGER PRIMARY KEY NOT NULL DEFAULT nextval('t_file_id_seq'::regclass),file_name CHARACTER VARYING(100),
content BYTEA,
create_date DATE
);
CREATE UNIQUE INDEX t_file_id_uindex ON t_file USING BTREE (id);
2.檔案實體類
public class FileUpload {
private Integer id;
private String fileName;private byte[] content;
private Date createDate;
}
3.Mybatis配置
<resultMap id="BaseResultMap" type="com.hsmdata.probe.base.model.FileUpload">
<id column="id" property="id" jdbcType="INTEGER"/><result column="file_name" property="fileName" jdbcType="VARCHAR"/>
<result column="content" property="content" jdbcType="BINARY"/>
<result column="create_date" property="createDate" jdbcType="DATE"/>
</resultMap>
4.儲存檔案
@RequestMapping("/upload2")
@ResponseBodyprotected void upload2(HttpServletRequest request,
HttpServletResponse response) throws IOException {
MultipartResolver resolver = new CommonsMultipartResolver(request.getSession().getServletContext());
if (resolver.isMultipart(request)) {
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
//接收檔案
MultipartFile documentFile = multipartRequest.getFile("myfiles");
List<MultipartFile> multipartFileList = multipartRequest.getFiles("myfiles");
//傳回所有檔案輸入型別的名稱
Iterator<String> files = multipartRequest.getFileNames();
String fileName = "";
String originalFilename = "";
String realPath = request.getSession().getServletContext().getRealPath("/upload");
while (files.hasNext()) {
fileName = (String) files.next();
System.out.println("FileName============" + fileName);
//用此方法得到上傳檔案的真正的檔名,這裡的fileName指檔案輸入型別的名稱
MultipartFile myfile = multipartRequest.getFile(fileName);
originalFilename = myfile.getOriginalFilename();
System.out.println("檔案原名: " + originalFilename);
System.out.println("檔名稱: " + myfile.getName());
System.out.println("檔案長度: " + myfile.getSize());
System.out.println("檔案型別: " + myfile.getContentType());
System.out.println("========================================");
try {
//這裡不必處理IO流關閉的問題,因為FileUtils.copyInputStreamToFile()方法內部會自動把用到的IO流關掉
//此處也可以使用Spring提供的MultipartFile.transferTo(FileMapper dest)方法實現檔案的上傳
// FileUtils.copyInputStreamToFile(myfile.getInputStream(), new File(realPath, originalFilename));
byte[] data = new byte[]{};
data = inputStreamToByte(myfile.getInputStream());
if (data == myfile.getBytes()) {
System.out.println("相等。。。。");
}
FileUpload file = new FileUpload();
file.setFileName(originalFilename);
file.setContent(data);
file.setCreateDate(new Date());
fileService.insert(file);
} catch (IOException e) {
System.out.println("檔案[" + originalFilename + "]上傳失敗,堆疊軌跡如下");
e.printStackTrace();
}
}
//設定響應給前臺內容的PrintWriter物件
PrintWriter out = response.getWriter();
//返回結果
JSONObject obj = new JSONObject();
obj.put("fileName", originalFilename);
out.print(obj.toJSONString());
}
}
//將檔案儲存到位元組陣列中
private byte[] inputStreamToByte(InputStream is) throws IOException {
ByteArrayOutputStream bAOutputStream = new ByteArrayOutputStream();
int ch;
while ((ch = is.read()) != -1) {
bAOutputStream.write(ch);
}
byte data[] = bAOutputStream.toByteArray();
bAOutputStream.close();
return data;
}
5.獲取檔案
@RequestMapping(value = "get", method = RequestMethod.GET)
@ResponseBodyprotected String get(Integer id) throws IOException {
FileUpload f = fileService.select(id);
byte[] data = f.getContent();
String fileName = f.getFileName();
FileOutputStream fos = null;
InputStream in = null;
//匯出成檔案
File file = new File("d:\\" + fileName);
if (!file.exists()) {
file.createNewFile(); // 如果檔案不存在,則建立
}
fos = new FileOutputStream(file);
int size = 0;
if (data.length > 0) {
fos.write(data, 0, data.length);
} else {
while ((size = in.read(data)) != -1) {
fos.write(data, 0, size);
}
in.close();
}
fos.close();
return "d:\\" + fileName;
}