用博客记录点滴……

利用arcserver 自带tomcat实现上传shapefile、cad等文件,然后用soe解析。

一、功能实现分析

1、soe中传入指定路径目录和文件名就能读取shp、cad并解析,然后返回JSON格式数据给flex端生成图形。(soe读取的是本地绝对路径)

2、所以首先要上传文件到soe发布所在的arcserver服务器。实现上传用java因此考虑用arcserver for java 自带的tomcat。

3、用arcserver自带tomcat上传要找到相应的tomcat路径并添加java包和jsp页面。

二、找到arcserver自带的tomcat并引入相应java包和jsp页面。

arcserver 9.3配置    路径:D:\Program Files\ArcGis\java\manager\service\tomcat\server\webapps\manager  最前面的目录可能不相同

在manager下的WIN-INF/lib下加入java包 ,并把你的jsp部署在manager目录下面(我的是放在mapPortal文件夹下),记得要在manager下面加入跨域文件crossdomain.xml。

flex中上传文件的URL:http://localhost:8399/manager/mapPortal/fileUp.jsp

arcserver 10.2配置  路径:C:\Program Files\ArcGIS\Server\framework\runtime\tomcat\webapps\arcgis#manager     最前面的目录可能不相同 

在arcgis#manager下的WIN-INF/lib下加入java包 ,并把你的jsp部署在arcgis#manager目录下面(我的是放在mapPortal文件夹下)。跨域文件10.2已经配置好了不需要再添加。

flex中上传文件的URL:http://192.168.179.224:6080/arcgis/manager/mapPortal/fileUp.jsp

这样配置以后就可以将shp或cad文件传到发布soe的服务器上了,而且不需要额外部署一个应该服务。

jsp上传代码:

<%@ page contentType="text/html; charset=GBK" %>
<%@ page import="java.util.*"%>
<%@ page import="java.io.*"%>
<%@ page import="org.apache.commons.fileupload.FileItem" %>
<%@ page import="org.apache.commons.fileupload.FileUploadException" %>
<%@ page import="org.apache.commons.fileupload.disk.DiskFileItemFactory" %>
<%@ page import="org.apache.commons.fileupload.servlet.ServletFileUpload" %>
<%
    String realPath = application.getRealPath("/");    
    //文件的保存目录
    String fileRootPath = realPath + "mapPortal\\upFiles\\";        
    int maxPostSize = 500 * 1024 * 1024;    
    DiskFileItemFactory factory = new DiskFileItemFactory();  
      factory.setSizeThreshold(4096);
      ServletFileUpload upload = new ServletFileUpload(factory);  
      upload.setSizeMax(maxPostSize);
      try {
          //检查上载文件的目录是否存在 
        File fileDir = new File(fileRootPath); 
        if(!fileDir.exists()){ 
            fileDir.mkdirs(); 
        }
          //读入上传的数据 
        int zipDataLength = request.getContentLength();
        //上载文件的最大字节 
        if(zipDataLength > maxPostSize){ 
            System.out.println("上传的文件字节数不可以超过500M");
            out.println("false@上传的文件字节数不可以超过500M");
            return; 
        }
        List fileItems = upload.parseRequest(request);  
        Iterator iter = fileItems.iterator();  
        while (iter.hasNext()) {  
            FileItem item = (FileItem) iter.next();  
            if (!item.isFormField()) {  
                String name = item.getName();
                //检查上载文件是否存在 
                File checkFile = new File(fileRootPath + name); 
                if(checkFile.exists()){
                    checkFile.delete();  
                    System.out.println(fileRootPath + name + " 文件已经存在,被删除"); 
                }                                        
                try {  
                    int index = name.lastIndexOf(".");
                    String extName = name.substring(index,name.length());
                    String newName = String.valueOf(System.currentTimeMillis())+extName; //用时间重命名(当前的毫秒)
                    item.write(new File(fileRootPath + newName)); 
                    out.println("success@" + fileRootPath + newName);//成功后返回路径和新的文件名
                    System.out.println("true:" + fileRootPath + newName); 
              } catch (Exception e) {  
                   e.printStackTrace();
                   out.println("false@"+e.getMessage());
                   return;  
              }  
          }  
      }  
  } catch (FileUploadException e) {  
      e.printStackTrace();  
      out.println("false@"+e.getMessage()); 
  }
%>

flex端用FileReference指向jsp所在的服务器

<?xml version="1.0" encoding="utf-8"?>
<mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" 
                xmlns:mytasks="pageaction.soe.*"
                width="290" height="120" showCloseButton="true" fontSize="12" 
                borderColor="#6489C6" borderAlpha="0.9" borderThickness="2" 
                borderThicknessBottom="2" borderThicknessLeft="2" titleIcon="@Embed(source='../images/importFile.png')"
                borderThicknessRight="2" headerHeight="22" title="导入ShapeFile或CAD文件" 
                close="this.visible=false" color="#FFFFFF" fontFamily="Microsoft YaHei UI">
    
    <mx:Script>
        <![CDATA[
            import com.esri.ags.Graphic;
            import com.esri.ags.geometry.Geometry;
            import com.esri.ags.geometry.MapPoint;
            import com.esri.ags.geometry.Polygon;
            import com.esri.ags.layers.GraphicsLayer;
            
            import mx.collections.ArrayCollection;
            import mx.controls.Alert;
            import mx.events.CloseEvent;
            import mx.managers.PopUpManager;
            import mx.rpc.AsyncResponder;
            import mx.rpc.events.FaultEvent;
            import mx.rpc.events.ResultEvent;
            import mx.rpc.http.HTTPService;
            import mx.rpc.remoting.mxml.RemoteObject;
            
            import pageaction.soe.soeEvent;
            import pageaction.soe.soeParameters;
            import pageaction.soe.soeResult;
            
            private var myFileReference:FileReference = new FileReference(); 
            
            private var filter_shp:FileFilter = new FileFilter("shapefile文件 (*.shp)", "*.shp"); 
            private var filter_dwg:FileFilter = new FileFilter("CAD文件 (*.dwg)", "*.dwg"); 
            private var filter_DWG:FileFilter = new FileFilter("CAD文件 (*.DWG)", "*.DWG"); 
            private var _soeUrl:String = "";
            
            public function get soeUrl():String{                
                return _soeUrl;
            }
            
            public function set soeUrl(value:String):void{
                _soeUrl = value;                    
            }
            
            private function soeExecute(filePath:String):void{
                var soeparameter:soeParameters = new soeParameters();
                //soeparameter.url = "http://localhost:8399/arcgis/rest/services/xz/MapServer/2/query";
                soeparameter.url = "http://192.168.179.169:6080/arcgis/rest/services/SampleWorldCities/MapServer/exts/ConvertShapeToJson/ConvertShapeToJsonOperation";
                /*soeparameter.outFields = "*";
                soeparameter.returnGeometry = true;
                var whereStr:String;
                if(this.txtWhere.text != ""){
                whereStr = this.txtWhere.text;
                }else{
                whereStr = "objectid = 780";
                }
                soeparameter.where = whereStr;*/
                //soeparameter.shapePath = "E:\\ShapeTest\\zz_test.shp";
                soeparameter.shapePath = filePath;
                soetask.showBusyCursor = true;
                soetask.execute(soeparameter);
            }
            
            private function compleShowSoeResult(event:soeEvent):void{
                var soeRe:soeResult = event.soeresult;
                var obj:Object = soeRe.obj;        
                var arrGraphics:Array = new Array();
                for(var i:int = 0;i<obj.geometries.length;i++){
                    var parentRing:Array = new Array();
                    var rings:Array = Array(obj.geometries[i].geometry.rings);//获取每个geometry的ring对象
                    for(var j:int=0;j<rings[0].length;j++){//每个geometry的ring组成部分
                        var partRing:Array = new Array();
                        var childRing:Array = rings[0][j];
                        for(var k:int=0;k<childRing.length;k++){//每个ring的点个数
                            var mapPoint:MapPoint = new MapPoint(childRing[k][0],childRing[k][1]);
                            partRing.push(mapPoint);
                        }
                        parentRing.push(partRing);
                    }
                    var ply:Polygon = new Polygon(parentRing);
                    var graphic:Graphic = new Graphic(ply);
                    arrGraphics.push(graphic);
                }    
                this.parentApplication.spatialAnalyByImportFileGraphic(arrGraphics);
                /*if(obj.features.length != 0){
                var temp:String = obj.features[0].attributes.KSMC;
                Alert.show(temp);
                }else{
                Alert.show("结果为空!");
                }*/    
            }
            
            private function btnSelectFileOnClick(event:Event):void{             
                myFileReference.browse([filter_shp,filter_dwg,filter_DWG]);
                myFileReference.addEventListener(Event.SELECT, onFileSelect);
                myFileReference.addEventListener(DataEvent.UPLOAD_COMPLETE_DATA, completeHandler);
                myFileReference.addEventListener(IOErrorEvent.IO_ERROR,ioerror);
                myFileReference.addEventListener(ProgressEvent.PROGRESS, progressHandler);
            }
            
            private function onFileSelect(event:Event):void{
                var fileName:String = myFileReference.name;
                this.txtFileName.text = fileName;                                  
            }
            
            private function completeHandler(evt:DataEvent):void{
                var strResult:String = String(evt.data);
                //截掉左右空格
                strResult = strResult.replace(/^\s*|\s*$/g,"").split(" ").join("");
                var returnArr:Array = strResult.split("@");
                var flag:String = returnArr[0];
                if(flag == "success"){
                    //promptMessage("上传成功!",this);
                    var filePath:String = returnArr[1];
                    if(filePath != "" || filePath != null){
                        soeExecute(filePath);
                    }                    
                }else{
                    promptMessage("上传失败!",this);
                }
                this.bar.visible = false;
            }
            
            private function ioerror(event:Event):void{    
                this.bar.visible = false;
                promptMessage("IO错误!\r 上传失败!",this);
                
            }
            
            private function progressHandler(event:ProgressEvent):void {
                var file:FileReference = FileReference(event.target);
                var baifenbi:Number=(event.bytesLoaded /event.bytesTotal)*100;
                bar.label=baifenbi.toString().substring(0,3)+"%";
                bar.setProgress(baifenbi,100);
                
            }
            
            private function importFile(event:Event):void{
                if (this.txtFileName.text == ""){
                    promptMessage("请选择要上传文件!",this);
                    return;
                }
                this.bar.visible = true;
                var requestUrl:String = "";
                var fileName:String = this.txtFileName.text;
                var fileType:String = fileName.substr(fileName.indexOf(".")+1,fileName.length);
                if(fileType == "shp"){
                    //requestUrl = "http://192.168.179.156:8080/mapPortal/fileUp.jsp";
                    requestUrl = "http://192.168.179.224:6080/arcgis/manager/mapPortal/fileUp.jsp";//arcserver 10.2
                    //requestUrl = "http://localhost:8399/manager/mapPortal/fileUp.jsp";////arcserver 9.3
                }else{//dwg
                    requestUrl = "http://192.168.179.156:8080/mapPortal/fileUp.jsp";
                }
                
                var request:URLRequest = new URLRequest(requestUrl);      
                try{
                    this.bar.visible = true;
                    myFileReference.upload(request);
                }catch (error:Error){ 
                    promptMessage("上传文件失败!",this);
                }        
            }
            
            private function promptMessage(msg:String, parent:DisplayObject):void{
                Alert.okLabel = "确定";
                var alert:Alert = new Alert();
                alert.setStyle("messageStyleName","AlertMessage");
                alert.setStyle("titleStyleName","AlertTitle");
                alert.title = "提示信息";
                alert.text = msg;
                PopUpManager.addPopUp(alert,parent,true);
                PopUpManager.centerPopUp(alert);                
            }     
        ]]>
    </mx:Script>
    <mytasks:soeTask id="soetask" executeComplete="compleShowSoeResult(event)"/>
    <mx:Canvas width="100%" height="100%" verticalScrollPolicy="off" horizontalScrollPolicy="off" color="#0B333C">
        <mx:Label x="3.5" y="15" text="选择导入文件:" fontWeight="bold"/>
        <mx:TextInput id="txtFileName" y="13" width="150" height="25" borderStyle="solid" right="50" editable="false" backgroundColor="#F9F9F9"/>
        <mx:Button id="btnSelectFile" y="13" label="……" width="35" click="btnSelectFileOnClick(event)" right="7" height="25"/>
        <mx:ProgressBar id="bar" labelPlacement="bottom"
                        minimum="0" visible="false" maximum="100" label="" trackHeight="15"
                        direction="right" mode="manual" width="100%" x="0" height="15" bottom="1" borderColor="#F6F7F7" themeColor="#FD250F"/>
        <mx:Button id="btnOk" x="87" y="50" label="确 定" click="importFile(event)" height="22"/>
        <mx:Button id="btnCancel" y="50" label="取 消" click="this.visible = false" height="22" right="50"/>
    </mx:Canvas>
</mx:TitleWindow>

 

posted @ 2015-11-03 10:11  aegisada  阅读(1046)  评论(0编辑  收藏  举报