Jeecgでファイルをアップロードする


Jeecgベースフレームワークでは、アップロード添付ファイルがカプセル化されています.デモンストレーションdemoのマルチ添付ファイル管理の例を参照して少し修正するだけでいいです(「一般的な例-マルチ添付ファイル管理」の下で、もう一つの例「アップロード」の下で「簡単すぎます.一般的なプロジェクトでは簡単ではありません).
まず、jeecgベースフレームワークに付属するストレージ添付ファイルのテーブルとエンティティの主なプロパティを見てみましょう.
private TSUser TSUser;//    
	private String businessKey;//      
	private String subclassname;//        
	private String attachmenttitle;//     
	private byte[] attachmentcontent;//     
	private String realpath;//       
	private Timestamp createdate;
	private String note;
	private String swfpath;// swf    
	private String extend;//    

ビジネス・キーは、ビジネス・テーブルのプライマリ・キーを格納するために使用されるビジネス・テーブルに関連付けることができます.
以下では、基本フレームワークに含まれる例を参照して修正する必要がある箇所を主に記録します.
  • controller
  • public ModelAndView addorupdate(ExprDelComEntity exprDelCom, HttpServletRequest req) {
    		if (StringUtil.isNotEmpty(exprDelCom.getId())) {
    			exprDelCom = exprDelComService.getEntity(ExprDelComEntity.class, exprDelCom.getId());
    			req.setAttribute("exprDelComPage", exprDelCom);
    			List<TSAttachment> exprDelComFiles = exprDelComService.findByProperty(TSAttachment.class, "businessKey", exprDelCom.getId());
    			req.setAttribute("exprDelComFiles", exprDelComFiles);
    		}
    		return new ModelAndView("com/jason/logistics/express/exprDelCom");
    	}

    ここではidに基づいて対応するエンティティインスタンスを取得する必要があるほか、ビジネス・プライマリ・キーのidに基づいて対応する添付ファイルのリストを取得する必要があります.jeecgが持参した例は、直接中間テーブルt_finance_files(対応するエンティティはTFInanceFilesEntity)を新規作成することです.添付ファイル表t_s_attachmentと業務との関連付けを保存するには、業務表に添付ファイル表との一対多の関係を確立することができ、ロード時に業務idに直接基づいて業務オブジェクトをロードすればよいという利点があり、ページで直接xxx.filesのように添付ファイルリストを取得することができ、こちらは添付ファイル表のbusinessKeyを直接利用し、多く構築する必要がないという利点がある1つのオブジェクトと中間テーブルですが、controllerでビジネステーブルのidに基づいて対応する添付ファイルのリストを追加する必要があります.
    @RequestMapping(params = "delFile")
    	@ResponseBody
    	public AjaxJson delFile( HttpServletRequest request) {
    		AjaxJson j = new AjaxJson();
    		String id  = request.getParameter("id");
    		TSAttachment file = systemService.getEntity(TSAttachment.class, id);
    		message = "" + file.getAttachmenttitle() + "     ";
    		
    		exprDelComService.deleteFile(file);
    		systemService.addLog(message, Globals.Log_Type_DEL,
    				Globals.Log_Leavel_INFO);
    		j.setSuccess(true);
    		j.setMsg(message);
    		return j;
    	}

    削除ファイルを処理するためのdelFileメソッドを追加します.
    @RequestMapping(params = "save")
    	@ResponseBody
    	public AjaxJson save(ExprDelComEntity exprDelCom, HttpServletRequest request) {
    		AjaxJson j = new AjaxJson();
    		if (StringUtil.isNotEmpty(exprDelCom.getId())) {
    			message = "          ";
    			ExprDelComEntity t = exprDelComService.get(ExprDelComEntity.class, exprDelCom.getId());
    			try {
    				MyBeanUtils.copyBeanNotNull2Bean(exprDelCom, t);
    				exprDelComService.saveOrUpdate(t);
    				systemService.addLog(message, Globals.Log_Type_UPDATE, Globals.Log_Leavel_INFO);
    			} catch (Exception e) {
    				e.printStackTrace();
    				message = "          ";
    			}
    		} else {
    			message = "          ";
    			exprDelComService.save(exprDelCom);
    			systemService.addLog(message, Globals.Log_Type_INSERT, Globals.Log_Leavel_INFO);
    		}
    //		j.setMsg(message);
    		j.setObj(exprDelCom);
    		return j;
    	}

    saveメソッドを変更すると、生成されたコードはStringタイプの情報を直接返します.こちらはページでビジネスエンティティのidやその他の可能な属性を取得する必要があるため、ビジネスオブジェクト全体のエンティティを返す必要があります(こちらは開発中にシェルを1つ押さえました)
    @RequestMapping(params = "del")
    	@ResponseBody
    	public AjaxJson del(ExprDelComEntity exprDelCom, HttpServletRequest request) {
    		AjaxJson j = new AjaxJson();
    		exprDelCom = systemService.getEntity(ExprDelComEntity.class, exprDelCom.getId());
    		message = "          ";
    		exprDelComService.deleteExprDelCom(exprDelCom);
    		systemService.addLog(message, Globals.Log_Type_DEL, Globals.Log_Leavel_INFO);
    		
    		j.setMsg(message);
    		return j;
    	}

    デフォルトのベースクラスのdeleteメソッドではなく、ビジネスエンティティを削除するときに専用のメソッドdeleteExprDelComを呼び出すdeleteメソッドを変更する必要があります.これは、対応するビジネステーブルのレコードを削除するほか、対応する添付ファイルテーブルのインスタンスとディスク内のファイルを削除する必要があるからです.
    @RequestMapping(params = "saveFiles", method = RequestMethod.POST)
    	@ResponseBody
    	public AjaxJson saveFiles(HttpServletRequest request, HttpServletResponse response, TSAttachment tSAttachment) {
    		AjaxJson j = new AjaxJson();
    		Map<String, Object> attributes = new HashMap<String, Object>();
    		String fileKey = oConvertUtils.getString(request.getParameter("fileKey"));//   ID
    		
    		String exprDelComId = oConvertUtils.getString(request.getParameter("exprDelComId"));//    ID
    		
    		if (StringUtil.isNotEmpty(fileKey)) {
    			tSAttachment = systemService.getEntity(TSAttachment.class, fileKey);
    
    		}
    //		ExprDelComEntity exprDelCom = exprDelComService.getEntity(ExprDelComEntity.class, exprDelComId);
    		tSAttachment.setBusinessKey(exprDelComId);
    		UploadFile uploadFile = new UploadFile(request, tSAttachment);
    		uploadFile.setCusPath("files");
    		uploadFile.setSwfpath("swfpath");
    		uploadFile.setByteField(null);//       
    		tSAttachment = systemService.uploadFile(uploadFile);
    		attributes.put("fileKey", tSAttachment.getId());
    		attributes.put("viewhref", "commonController.do?objfileList&fileKey=" + tSAttachment.getId());
    		attributes.put("delurl", "commonController.do?delObjFile&fileKey=" + tSAttachment.getId());
    		j.setMsg("      ");
    		j.setAttributes(attributes);
    
    		return j;
    	}

    saveFilesメソッドを追加して添付ファイルをアップロードするロジックを専門に処理
    2. service
    public interface ExprDelComServiceI extends CommonService{
    
    	void deleteFile(TSAttachment file);
    	void deleteExprDelCom(ExprDelComEntity exprDelCom);
    }

    インタフェースに2つのメソッドを追加します.1つは添付ファイルを削除する方法で、1つはビジネスエンティティを削除する方法です.
    @Service("exprDelComService")
    @Transactional
    public class ExprDelComServiceImpl extends CommonServiceImpl implements ExprDelComServiceI {
    	/**
    	 *     
    	 */
    	public void deleteFile(TSAttachment file) {
    		
    		//[1].    
    		String sql = "select * from t_s_attachment where id = ?";
    		Map<String, Object> attachmentMap = commonDao.findOneForJdbc(sql, file.getId());
    		//      
    		String realpath = (String) attachmentMap.get("realpath");
    		String fileName = FileUtils.getFilePrefix2(realpath);
    		
    		//          
    		String realPath = ContextHolderUtils.getSession().getServletContext().getRealPath("/");
    		FileUtils.delete(realPath+realpath);
    		FileUtils.delete(realPath+fileName+".pdf");
    		FileUtils.delete(realPath+fileName+".swf");
    		//[2].    
    		commonDao.delete(file);
    	}
    
    	/**
    	 *       
    	 */
    	public void deleteExprDelCom(ExprDelComEntity exprDelCom) {
    		//[1].      
    		String attach_sql = "select * from t_s_attachment where id in (select id from t_finance_files where financeId = ?)";
    		List<Map<String, Object>> attachmentList = commonDao.findForJdbc(attach_sql, exprDelCom.getId());
    		for(Map<String, Object> map:attachmentList){
    			//      
    			String realpath = (String) map.get("realpath");
    			String fileName = FileUtils.getFilePrefix2(realpath);
    			
    			//          
    			String realPath = ContextHolderUtils.getSession().getServletContext().getRealPath("/");
    			FileUtils.delete(realPath+realpath);
    			FileUtils.delete(realPath+fileName+".pdf");
    			FileUtils.delete(realPath+fileName+".swf");
    		}
    		//[2].      
    		commonDao.delete(exprDelCom);
    	}
    }

    実装クラスにプロピオンメソッドを追加する実装は,jeecg例のコードに従って少し修正すればよい.
    3.インタフェース(jsp)
    <script type="text/javascript">
      $(function(){
        //       ,             
    	if(location.href.indexOf("load=detail")!=-1){
    		$(".jeecgDetail").hide();
    	}
       });
    
      	function uploadFile(data){
      		$("#exprDelComId").val(data.obj.id);
      		alert($(".uploadify-queue-item"));
      		if($(".uploadify-queue-item").length>0){
      			upload();
      		}else{
      			frameElement.api.opener.reloadTable();
      			frameElement.api.close();
      		}
      	}
      	
      	function close(){
      		frameElement.api.close();
      	}
      </script>
    <!--            -->
    <style type="text/css">
    #formobj {
    	height: 65%;
    	min-height: 300px;
    	overflow-y: auto;
    	overflow-x: auto;
    	min-width: 600px;
    }
    </style>

    新しい修正インタフェースセクションに添付ファイルに関するコードを追加します.uploadFileメソッドが最も主要で、フォームを提出してビジネステーブルの記録を保存することに成功した後、このメソッドを呼び出して添付ファイルをアップロードし続けます.つまりjeecgでアップロード添付ファイルを処理するのは2つのステップに分けて処理されます.
    <t:formvalid formid="formobj" dialog="true" usePlugin="password"
    		layout="table" callback="@Override uploadFile" action="exprDelComController.do?save">

    ここではjeecgのt:formvalidラベルを使用しています.デフォルトで生成されたコードにはcallbackという属性はありません.ここでこの属性を追加するのは、フォームのコミットに成功した後も添付ファイルをアップロードし続けるためです(@Override uploadFile)あ、こちらのuploadFileは前に追加したjavascripメソッド名に対応していますが、前の@OverrideキーワードはデフォルトでuploadFileというメソッドがあると思いますが、こちらは書き換え専用です.
    <tr>
    				<td align="right"><label class="Validform_label">     :
    				</label></td>
    				<td class="value"><input type="hidden"
    					value="${exprDelComPage.id}" id="exprDelComId" name="exprDelComId" />
    					<table>
    						<c:forEach items="${exprDelComFiles}" var="exprDelComFile">
    							<tr style="height: 34px;">
    								<td>${exprDelComFile.attachmenttitle}</td>
    								<td><a
    									href="commonController.do?viewFile&fileid=${exprDelComFile.id}&subclassname=org.jeecgframework.web.system.pojo.base.TSAttachment"
    									title="  ">  </a></td>
    								<td><a href="javascript:void(0);"
    									onclick="openwindow('  ','commonController.do?openViewFile&fileid=${exprDelComFile.id}&subclassname=org.jeecgframework.web.system.pojo.base.TSAttachment','fList','800','700')">  </a></td>
    								<td><a href="javascript:void(0)" class="jeecgDetail"
    									onclick="del('exprDelComController.do?delFile&id=${exprDelComFile.id}',this)">  </a></td>
    							</tr>
    						</c:forEach>
    					</table></td>
    			</tr>
    			<tr>
    			<td></td>
    			<td class="value"><script type="text/javascript">
    					$.dialog.setting.zIndex =1990;
    					function del(url,obj){
    						$.dialog.confirm("        ?", function(){
    						  	$.ajax({
    								async : false,
    								cache : false,
    								type : 'POST',
    								url : url,//    action  
    								error : function() {//         
    								},
    								success : function(data) {
    									var d = $.parseJSON(data);
    									if (d.success) {
    										var msg = d.msg;
    										tip(msg);
    										$(obj).closest("tr").hide("slow");
    									}
    								}
    							});  
    						}, function(){
    						});
    					}
    					</script>
    			<div class="form" id="filediv"></div>
    			<div class="form jeecgDetail">
    			<t:upload name="fiels" id="file_upload" extend="pic" buttonText="    " formData="exprDelComId" uploader="exprDelComController.do?saveFiles">
    			</t:upload>
    				</div>
    			</td>
    		</tr>

    ここで添付ファイルの表示とアップロードのコントロール部分を追加しました.ここでt:uploadというラベルが最も主要です.formDataという属性は添付ファイルをアップロードする際に一緒に提出する必要があるフォームの他の属性です.一般的にはビジネスエンティティのプライマリ・キーを提出すればいいのですが、uploaderという属性は添付ファイルをアップロードするリンクに対応しています.