使用HTML、PHP、bootstap及JS插件canvasJS实现文件的上传、图形显示

本文介绍了基于HTML、php的文件上传、显示。可以实现数据采集获取的时域、频域的数据显示。
步骤及代码如下。
1.用HTML5和bootstap构建图形的基本架构,代码如下:

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>ReadingAndDisplaying the file of unv</title>
<link rel="stylesheet"  href="source/bootstrap.min.css">
<script src="source/jquery-3.4.1.min.js"></script>
<script src="source/bootstrap.bundle.min.js"></script>
</head>
<body>
	<div class="container"><!--main frame -->
		<div class="row">  <!-- 菜单区-->
		</div>
		<div class="row">  <!-- the area of selecting the file -->
			<!--  mb-xx 用来调整标签的下边距  -->
			<form method="POST" action="readingfile.php" enctype="multipart/form-data">
               <div class="mb-3">
               <label for="file_1" class="form-label">选择要显示的文件</label>
               <input type="file" class="form-control" id="file_1" name="file_1" multiple>
               <div id="tishi" class="form-text"  style="color: red;">请选择单个unv文件,然后上传</div>
				<button  type="submit" value="tijiao" class="btn btn-primary mb-2">上传</button> 
              </div>
				 <!-- <button  id="tijiao" type="button" class="btn btn-primary mb-3">提交</button>    the type of the button is "button",or is default submit!   -->
				
			</form>
			 
	    </div>
		<button class="btn btn-primary mb-1 btn" id="xianshi">显示已经上传的文件</button>
	
		<div class="row mb" id="displaymes">文件信息显示区</div>
		<div class="row" id="displaycurve">
		
		</div>
	</div>

	<script type="text/javascript">
     $(document).ready(function(){
		 $("#xianshi").click(function(e){
			 $.ajax({
				 url:"filename.php",
				 method:"GET"
			 })
			 .done(function(res){
				 $("#displaymes").html(res);
			 })
			 
		 })  /* tijiao*/
	 })  /* document */
	</script>  
</body>
</html>

2.用php显示文件的上传:,代码如下:

<?php
	 $name = $_FILES['file_1']['name'];
	 if(move_uploaded_file($_FILES['file_1']['tmp_name'],"myfile/$name")){
	     echo "成功上传 <br/>";
	     echo "文件大小为:".$_FILES['file_1']['size'];
	  }
	 else{
		echo "Failed ,the size of the file is:".$_FILES['file_1']['size'];
		echo "<br/>";
	 }			
?>

3.用php再现上传文件的名称。代码如下:

<?php            
header("content-type:text/html;charset=utf-8");  //保证传输文件格式
 // 获取文件夹中的所有txt文件名
$dir = "myfile/"; //这里输入其他路径
$handle = opendir($dir.".");
$row = array();
while (false!=($file=readdir($handle)))
{
   if($file!="."&&$file!="..")
    {
      $row[]['name'] = $file;//将文件名存入数组 $row
    }	
}
 $files = [];
 echo "已经上传的文件如下:";
 echo "<form method='post' action='displayfile_1.php'>";
 foreach ($row as $k => $v) 
   {
    $files[] = $row[$k]['name'];   //$files是该文件夹下所有文件的名字
   echo ($k+1).".<input type=\"checkbox\" name=\"file[]\" value=\"$files[$k]\">".$files[$k]."<br/>";
   }
echo "<button id='display_1' class='btn btn-primary'>显示曲线</button>";
echo "</form>";

closedir($handle);
?>

4.用php和JS插件canvasJS实现图形的显示,代码如下:

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>曲线显示</title>
	<meta name="viewport" content="width=device-width,initial-scale=1.0">
	<link rel="stylesheet"  href="source/bootstrap.min.css">
	<script src="source/jquery-3.4.1.min.js"></script>
	<script src="source/bootstrap.bundle.min.js"></script>
	<script type="text/javascript" src="source/canvasjs.min.js"></script>
</head>
<body>
	<p><a href="index.html" style="text-decoration: underline;">回到选择页面</a></p>
	<h4>要显示的数据信息</h4>
<?php
  $file= $_POST['file'];  //传递过来的file数组
   //下面的语句为读取并显示file
   $message = [];  //收集各个文件的信息,是一个2维数组
   $freqArr =[];
   $processMethod_1 =[]; //存储各个文件的类型:random、sine、time
   $freqFen = [];
  for($i = 0;$i < count($file);$i++){   //for语句循环文件夹下的每一个文件,打开并处理
     $file_arr =$file[$i]; 
	 $fp = fopen("myfile/".$file_arr,"r");  //须写上要打开的文件的文件夹myfle,因为php文件和要打开的文件不在一个文件夹里。 
	
	  $singlemessage = [];  //单个文件的通道数、如果是随机信号,起始频率和分辨率
	  $processMethod =[];   //处理方式peak or harmonics
	  $message[$i]['filename'] =$file[$i];  //将文件信息赋予数组
	  for($j = 0;$j<18;$j++)
	    fgets($fp);
	  $processMethod = preg_split('/\s+/',trim(fgets($fp)));
	  $processMethod_1[] = $processMethod[0];
	  for($j = 0;$j<5;$j++)
	    fgets($fp);
	   //preg_match('/\d{2,}/',fgets($fp),$singlemessage);   //捕获测点的数目
	   $singlemessage = preg_split('/\s+/',trim(fgets($fp)));
	   $message[$i]['number'] = $singlemessage[1];  //将测点的数个赋予message数组
	  
	   $startFreq = $singlemessage[3];//随机信号频率信息
	   $freqFen[] = $singlemessage[4];//随机信号频率分辨率
	   
	   $lineNumer = ceil($singlemessage[1]/2);

	  for($k=0;$k<4;$k++)
	   fgets($fp);
	  if(!strcmp($processMethod[0],"PSD")){ // the frequency message of the random signal
		  $freq = [];//记录频率信息
	    for($m=0;$m < $singlemessage[1];$m++){
		  $freq[]= $startFreq;
		  $startFreq += $singlemessage[4];
	     }
	  }
	  elseif(!strcmp($processMethod[0],"Time")){
		$freq = [];//记录频率信息
	    for($m=0;$m < $singlemessage[1];$m++){
		  $freq[]= $startFreq;
		  $startFreq += $singlemessage[4];
	     }
	  }
	  else{                   //the frequency message of the sine signal
	    $freq = [];//记录频率信息
	    for($m=0;$m<$lineNumer;$m++){
		   $str1 = trim(fgets($fp));
		   $arr_1 = preg_split('/\s+/',$str1);
		   $freq[]= $arr_1[0];
		   $freq[] = $arr_1[3];
	     }  
	  }
	  $freqArr[$i] = $freq;  //各个文件的频率信息
	  
	  //加上判断滤波还是峰值算法的判断
	  
	  rewind($fp);
	  for($n=0;$n<16;$n++)
	     fgets($fp);
	  $str_arr=[];
	  if(!strcmp($processMethod[0],"PSD")){  //随机处理模块
		  while(!feof($fp)){   //循环读取各个数据
		  for($l=0;$l<2;$l++)
		  fgets($fp);
		  $str_1 = trim(fgets($fp));
		  $str_arr = preg_split('/\s+/',$str_1);
		  $nodename = $str_arr[2];
		  $message[$i]['nodename'][]=$nodename;
		 for($l=0;$l<10;$l++)
			 fgets($fp);
		  $amp=[];
		  for($m=0;$m < ceil($singlemessage[1]/6);$m++){  //读取一个点的数据;
		  $str1 = trim(fgets($fp));
		  $arr_1 = preg_split('/\s+/',$str1);
		  for($j= 0;$j<6;$j++)
		        $amp[] = $arr_1[$j];
	         }  //读取一个点的所有数据
		  $message[$i]['data'][$nodename]=$amp;
		  fgets($fp);
	   } //循环读取各个点的数据。
	  }
	  elseif(!strcmp($processMethod[0],"Harmonic")){
		  while(!feof($fp)){   //循环读取各个数据
		  for($l=0;$l<2;$l++)
		  fgets($fp);
		  $str_1 = trim(fgets($fp));
		  $str_arr = preg_split('/\s+/',$str_1);
		  $nodename = $str_arr[3];
		  $message[$i]['nodename'][]=$nodename;
		 for($l=0;$l<10;$l++)
			 fgets($fp);
		  $amp=[];
		  for($m=0;$m < $lineNumer;$m++){  //读取一个点的数据;
		  $str1 = trim(fgets($fp));
		  $arr_1 = preg_split('/\s+/',$str1);
		  $first = sqrt(pow($arr_1[1],2)+pow($arr_1[2],2));
		  $second = sqrt(pow($arr_1[4],2)+pow($arr_1[5],2));
		  $amp[]= $first;
		  $amp[] = $second;
	         }  //读取一个点的所有数据
		  $message[$i]['data'][$nodename]=$amp;
		  fgets($fp);
	   } //循环读取各个点的数据。
	  }
	   elseif(!strcmp($processMethod[0],"Time")){  //Time domain data process
		  while(!feof($fp)){   //循环读取各个数据
		  for($l=0;$l<2;$l++)
		  fgets($fp);
		  $str_1 = trim(fgets($fp));
		  $str_arr = preg_split('/\s+/',$str_1);
		  $nodename = $str_arr[2];
		  $message[$i]['nodename'][]=$nodename;
		 for($l=0;$l<10;$l++)
			 fgets($fp);
		  $amp=[];
		  for($m=0;$m < ceil($singlemessage[1]/6);$m++){  //读取一个点的数据;
		  $str1 = trim(fgets($fp));
		  $arr_1 = preg_split('/\s+/',$str1);
		  for($j= 0;$j<6;$j++)
		        $amp[] = $arr_1[$j];
	         }  //读取一个点的所有数据
		  $message[$i]['data'][$nodename]=$amp;
		  fgets($fp);
	   } //循环读取各个点的数据。
	  }
	  else{
	  while(!feof($fp)){   //循环读取各个数据
		  for($l=0;$l<2;$l++)
		  fgets($fp);
		  $str_1 = trim(fgets($fp));
		  $str_arr = preg_split('/\s+/',$str_1);
		  $nodename = $str_arr[3];
		  $message[$i]['nodename'][]=$nodename;
		 for($l=0;$l<10;$l++)
			 fgets($fp);
		  $amp=[];
		  for($m=0;$m < $lineNumer;$m++){  //读取一个点的数据;
		  $str1 = trim(fgets($fp));
		  $arr_1 = preg_split('/\s+/',$str1);
		  $amp[]= $arr_1[1];
		  $amp[] = $arr_1[4];
	         }  //读取一个点的所有数据
		  $message[$i]['data'][$nodename]=$amp;
		  fgets($fp);
	   } //循环读取各个点的数据。
	  } //else 
	}  //将所有打开的文件信息读完
	
	//以下将显示文件信息
	for($i=0;$i<count($file);$i++){
	  echo "<p>读取的文件为: <i>$file[$i]</i></p>";
	}
	$messageJson = json_encode($message);
	$fileJson = json_encode($file);
	$freqJson = json_encode($freqArr);
	$processMethodJson = json_encode($processMethod_1);
	$freqFenJson = json_encode($freqFen);

echo <<<xinxi
<script type="text/javascript">    
  var message=$messageJson;
  var file = $fileJson;
  var freq = $freqJson;
  var processMethod = $processMethodJson;  //数据类型: 随机、正弦等
  var freqFen = $freqFenJson;//随机频率分辨率
</script>
xinxi;
	?>
   <h3>选择要显示的点</h3>
	<form method="POST" action="">
		<input type="button" value="PRE" id="pre">
		<?php
		 for($i=1;$i <= count($file);$i++){
			 echo "<select id=\""."mySelect".$i."\">";
	      for($j=0;$j<count($message[$i-1]['nodename']);$j++){
			 ?>
			  <option value="<?=$message[$i-1]['nodename'][$j]?>"><?=$message[$i-1]['nodename'][$j]?></option>
		<?php
		    } 
			echo "</select>";
		 }
		?>
		<input type="button" value="NEXT" id="next">
		<input type="button" value="RESET" id="reset">
	</form>
	<br/>
    <div id="chartContainer" style="min-height: 400px;max-width: 1200px; margin: 0px auto;border: 1px solid lightgrey"></div>	
	<br/>
	
	<script type="text/javascript">
		//javascript 里的变量名称不能重合;
		var filelength = file.length; // 打开文件的个数
	    var dataMessage = [];
		var nodeName = [];
         
	function draw(dataMessage){
     var chart = new CanvasJS.Chart("chartContainer", {
	//animationEnabled: true, //实现图像的动态生成;
	 exportEnabled:true,
	 zoomEnabled:true,  //可以放大局部图像;
	 theme: "light2",
	 legend:{
		    horizontalAlign: "center", // "center" , "right"
            verticalAlign: "top",  // "top" , "bottom"
            fontSize: 15,
		    fontColor:"red",
		    dockInsidePlotArea: true,
		    itemclick:toogleDataSeries
		   },
		axisX:{
			title: "频率(F)",
          	logarithmic: true,    //如果数据中有零点,无法显示
			crosshair:{
				enabled:"true",
				valueFormatString: "###.00"
			    },
				alueFormatString: "###.000"
	        },
		 axisY:{
			title: "	响应值(g)",
          	logarithmic: true    //如果数据中有零点,如法显示
	          },
	     data: dataMessage
         });
	   chart.render();
    }  
	//上述为draw函数
		
	function drawtime(dataMessage){
     var chart = new CanvasJS.Chart("chartContainer", {
	//animationEnabled: true, //实现图像的动态生成;
	 exportEnabled:true,
	 zoomEnabled:true,  //可以放大局部图像;
	 theme: "light2",
	title: {
		text: "时域响应曲线",
		fontSize:15	
	},
	 legend:{
		horizontalAlign: "right", // "center" , "right"
        verticalAlign: "top",  // "top" , "bottom"
        fontSize: 15,
		fontColor:"red",
		dockInsidePlotArea: true,
		itemclick:toogleDataSeries
		},
	 axisX:{
			title: "时间",
			crosshair:{
				enabled:"true",
				valueFormatString: "###.00"
			},
				alueFormatString: "###.000"
	    },
	axisY:{
			title: "响应值(g)"
	    },
	data:dataMessage
   });
	   chart.render();
}//以上为drawtime函数
		
	   //画PSD曲线
		function drawpsd(freq,amp,fileName,name,fre){
			 var sum = 0;
	         var y = 0; 
			 for(var k=0;k < freqLength;k++){  // 每个通道的个数 	
			     dataPointsTemp.push({x: parseFloat(freq[k]), y: parseFloat(amp[k])}); 
				//计算总均方根值
				 y = parseFloat(amp[k]);
			     sum += parseInt(fre)*y;
			} //k循环
			sum = Math.sqrt(sum).toFixed(3);
			dataMessage.push({type:"line",showInLegend:true,legendText:fileName+" "+name+" Grms:"+sum,dataPoints:dataPointsTemp});
		}
		
		//画正弦曲线
		function drawsine(freq,amp,fileName,name){
			var max = 0.0;
			var amplitude = 0.0;
			for(var k=0;k < freqLength;k++){ // 每个通道的个数 
			  amplitude = parseFloat(amp[k]);
			 dataPointsTemp.push({x: parseFloat(freq[k]), y: amplitude}); 
			 max =  amplitude > max ?amplitude:max;
		   } //k循环
			max = max.toFixed(2);
			dataMessage.push({type:"line",showInLegend:true,legendText:fileName+" "+name+"\n\r"+"Max is "+max+" g",dataPoints:dataPointsTemp});
			
		}
		
		function drawtime2(freq,amp,fileName,name){
			var max = 0.0;
			var amplitude = 0.0;
			for(var k=0;k < freqLength;k++){ // 每个通道的个数 
			  amplitude = parseFloat(amp[k]);
			 dataPointsTemp.push({x: parseFloat(freq[k]), y: amplitude}); 
			 max =  amplitude > max ?amplitude:max;
		   } //k循环
			max = max.toFixed(2);
			
			dataMessage.push({type:"line",showInLegend:true,legendText:fileName+" "+name+"\n\r"+"Max is "+max+" g",dataPoints:dataPointsTemp});
		}
	//以下语句画出第一个点曲线。
	for(var i=0 ; i < filelength;i++){  //文件的个数
	     var dataPointsTemp = [];            //define the global varible
	     nodeName[i] = message[i]["nodename"];
		  
		 var firstName = nodeName[i][0];
		 var freqLength= freq[i].length - 1;  //所选中点的采样个数。

		 if(processMethod[i] == "PSD"){ //这个应该放在file里,一起显示
			drawpsd(freq[i],message[i]["data"][firstName],file[i],firstName,freqFen[i]);
			 draw(dataMessage);
		 }
		  else if(processMethod[i] == "Time"){
			  drawtime2(freq[i],message[i]["data"][firstName],file[i],firstName);
			  drawtime(dataMessage);
		  }
		   else{
			   drawsine(freq[i],message[i]["data"][firstName],file[i],firstName);
			   draw(dataMessage);
		}
			
	} //i 循环
   
	  var index = []; //标记点号在每个select中的位置
	  var name1 = $('select').map(function(){
			return $(this).val();
		}).toArray(); //获取选择框中的option内容
		
	  for(var i = 0;i < filelength; i++){
		  index[i] = nodeName[i].indexOf(name1[i]);//获取option中的内容在当前select中的序列号,从0开始。
	      }
		
	$('select').change(function(event){ //点号选择框改变后,显示不同的曲线
		var name = $('select').map(function(){
			return $(this).val()
		   }).toArray(); //获取选择框中的option内容
		dataMessage = [];
		var number = $(event.target).index();  //获取select在form中的次序,以便于知道那个select改变了,从 1 开始;
		var selectNumber = number-1;
        for(var i = 0;i< filelength; i++){
			 dataPointsTemp = [];
			 index[i] = nodeName[i].indexOf(name[i]);//获取option中的内容在当前select中的序列号,从0开始。
			 var freqLength = freq[i].length - 1;  //所选中点的采样个数。
			
			 if(processMethod[i] == "PSD"){
				 drawpsd(freq[i],message[i]["data"][name[i]],file[i],name[i],freqFen[i]);
				 draw(dataMessage);
		   }
			  else if(processMethod[i] == "Time"){
			  drawtime2(freq[i],message[i]["data"][name[i]],file[i],name[i]);
			  drawtime(dataMessage);
			  }
			else{
				 drawsine(freq[i],message[i]["data"][name[i]],file[i],name[i]);
				draw(dataMessage);
		 }
		}
	 });
	
	    $('#pre').click(function(event){
			index = $.map(index,function(value){
				return value>0?value-1:value;
			});
			$('select').each(function(i){
				$(this).val(nodeName[i][index[i]]);
			});
			//copy change function
			var name2 = $('select').map(function(){
			    return $(this).val()
		     }).toArray(); //获取选择框中的option内容
			 dataMessage = [];

             for(var i = 0;i< filelength; i++){
			 dataPointsTemp = [];
			 var freqLength = freq[i].length - 1;  //所选中点的采样个数。
				 
			if(processMethod[i] == "PSD"){
				drawpsd(freq[i],message[i]["data"][name2[i]],file[i],name2[i],freqFen[i]);
				 draw(dataMessage);
		   }
			 else if(processMethod[i] == "Time"){
			  drawtime2(freq[i],message[i]["data"][name2[i]],file[i],name2[i]);
			  drawtime(dataMessage);
			 }
			else{	  
				drawsine(freq[i],message[i]["data"][name2[i]],file[i],name2[i]);
				 draw(dataMessage);
		     }
			}
		    
			//copy change function
	     });   
		// pre click 函数
	    //next 函数
		$('#next').click(function(event){
			index = $.map(index,function(value,i){  //
				return value < nodeName[i].length-1?value+1:nodeName[i].length-1;//必须小于length-1
			  });
			$('select').each(function(i){
				$(this).val(nodeName[i][index[i]]);
			  });
			
			//复制 change function
			var name3 = $('select').map(function(){
			    return $(this).val()
		       }).toArray(); //获取选择框中的option内容
		     dataMessage = [];

         for(var i = 0;i< filelength; i++){
			 dataPointsTemp = [];
			 var freqLength = freq[i].length - 1;  //所选中点的采样个数。
			 
			  if(processMethod[i] == "PSD"){
				  drawpsd(freq[i],message[i]["data"][name3[i]],file[i],name3[i],freqFen[i]);
				  draw(dataMessage);
		    }
			 else if(processMethod[i] == "Time"){
			  drawtime2(freq[i],message[i]["data"][name3[i]],file[i],name3[i]);
			  drawtime(dataMessage);
			 }
			else{	
				 drawsine(freq[i],message[i]["data"][name3[i]],file[i],name3[i]);
				draw(dataMessage);
		   }
		   }     
	   });  
		//next click函数
   
		//reset 按钮将所有的文件置于开始
		$('#reset').click(function(event){
		   dataMessage = [];  //白颜色表示全局变量,紫颜色表示局部变量
			
		   $('select').each(function(i){
			$(this).val(nodeName[i][0]);
			});
			
	     for(var i=0 ; i < filelength;i++){  //文件的个数
	       dataPointsTemp = [];            //define the global varible
	       nodeName[i] = message[i]["nodename"];
		  
		   var firstName2 = nodeName[i][0];
		   var freqLength2 = freq[i].length - 1;  //所选中点的采样个数。
		   var sum_3 = 0;
	       var y1_1 = 0; 
		   if(processMethod[i] == "PSD"){ //这个应该放在file里,一起显示
			   drawpsd(freq[i],message[i]["data"][firstName2],file[i],firstName2,freqFen[i]);
			   draw(dataMessage);
		    }
			 else if(processMethod[i] == "Time"){
			  drawtime2(freq[i],message[i]["data"][firstName2],file[i],firstName2);
			  drawtime(dataMessage);
			 }
		     else{
				   drawsine(freq[i],message[i]["data"][firstName2],file[i],firstName2);
				 draw(dataMessage);
		   }
			name1 = $('select').map(function(){
			   return $(this).val();
		    }).toArray(); //获取选择框中的option内容
		
	      for(var n = 0;n < filelength; n++){
		     index[n] = nodeName[n].indexOf(name1[n]);//获取option中的内容在当前select中的序列号,从0开始。
	      }
	    } //i 循环
	   });  // click the button of th  reset.
		
	function toogleDataSeries(e){ 
	    if (typeof (e.dataSeries.visible) === "undefined" || e.dataSeries.visible) {
		   e.dataSeries.visible = false;
	    } else{
		e.dataSeries.visible = true;
	       }
	    e.chart.render();    //if the data has changed ,chen you should call this funcition;
      } 	 
</script>
</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值