Java中上傳文件和表單數據提交如何保持數據的一致性?


學生申請學科競賽活動,表單中有學科競賽的申報信息和部分附件,需要做到將上傳文件和表單數據提交保持一致性。

將上傳文件和插入表單數據放到事務匯總去處理,由於表單的數據我們可以控制,但是上傳的文檔不好控制。一方面我就把表單數據提交放置在文件上傳前面,這樣當表單數據提交發生異常我們可以回滾,文件並未上傳,當文件上傳發生異常時,我們可以回滾數據庫的數據,只有當文件正常上傳時我們才提交數據庫數據。。。

 

---------------------------------------------------------------------------------------------------------------------------------------

 1     @Override
 2     public boolean applActivity(XkTeam team, Document doc, DocType doctype,
 3             FileInputStream fin) {
 4 
 5         boolean flag = true;
 6         FileOutputStream fos = null;//文檔輸出流
 7         // ------------處理需要向數據庫提交的文檔、文檔類型及申報信息--------------------
 8         // 開啟事務,設置不自動提交
 9         JDBCTools.startTransaction();
10 
11         try {
12             // 判斷是個人申報還是團體申報調用不同的方法
13             // 個人申報
14             if (team.getAppType() == 0) {
15                 
16                 flag = idao.addPersonApp(team);
17                 //更新當前申報人數
18                 flag = idao.updateCurrentNum(team.getAppType(),1);
19             }
20 
21             // 團體申報
22             if (team.getAppType() == 1) {
23                 
24                 
25                 flag = idao.addTeamInfor(team);
26                 flag = idao.addTeamMember(team.getMemberlist());
27                 //更新當前申報人數
28                 flag = idao.updateCurrentNum(team.getActiId(), team.getMemberlist().size());
29             }
30             
31          if(doc != null && doctype != null){ //處理用戶是否上傳文檔
32             // 調用dao層插入文件的方法
33              flag = idao.addDocument(doc);
34              // 調用dao層插入文件類型方法
35              flag = idao.addDocType(doctype);
36              
37              // ---------------處理上傳文檔------------
38              // 1.創建上傳文檔File
39              File file = new File(doc.getDoc_path());
40              // 2.創建寫文檔對象
41              fos = new FileOutputStream(file);
42              // 3.創建緩沖流
43              byte[] buffer = new byte[1024];
44              int len = 0;
45              while ((len = fin.read(buffer)) > 0) {
46                  // 寫入文件
47                  fos.write(buffer, 0, len);
48              }
49          }
50             // 提交
51             JDBCTools.commit();
52         } catch (Exception e2) {
53             e2.printStackTrace();
54             // 發生異常回滾
55             JDBCTools.rollback();
56             throw new RuntimeException("申報失敗,請聯系管理員!", e2);
57         } finally {
58             // 關閉資源
59             JDBCTools.setCommitTrue();
60             JDBCTools.close();
61             
62             if(fos != null){
63                 try {
64                     fos.close();
65                 } catch (IOException e) {
66                     e.printStackTrace();
67                 }
68             }
69         }
70 
71         return flag;
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM