1. 程式人生 > >PostgreSQL儲存檔案到資料庫

PostgreSQL儲存檔案到資料庫

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")

@ResponseBody
protected 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)

@ResponseBody
protected 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;
}