Révision 0bd646e4
Ajouté par Victor PONGNIAN il y a plus de 11 ans
.htaccess | ||
---|---|---|
1 |
AddDefaultCharset UTF-8 |
|
2 |
php_value output_buffering off |
|
3 |
php_value display_errors on |
|
4 |
php_value error_reporting 32767 |
addParams.php | ||
---|---|---|
1 | 1 |
<!DOCTYPE html> |
2 | 2 |
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr"> |
3 |
<head> |
|
4 |
<meta http-equiv="Content-type" content="text/html; charset=UTF-8"/> |
|
5 |
<link rel="stylesheet" media="screen" href="css/index_style.css" /> |
|
6 |
<title>Positionnerment dun panoramique</title> |
|
3 | 7 |
<?php |
4 |
if(isset($_GET['dir']) && isset($_GET['panorama'])){ |
|
5 |
|
|
6 |
$_GET['dir'] = htmlspecialchars($_GET['dir']); //Protection des variables GET. |
|
7 |
$_GET['panorama'] = htmlspecialchars($_GET['panorama']); // ... |
|
8 |
|
|
9 |
if (isset($_POST['param_latitude']) && isset($_POST['param_longitude']) |
|
10 |
&& isset($_POST['param_altitude']) && isset($_POST['param_elevation']) |
|
11 |
&& isset($_POST['param_title']) && isset($_POST['param_loop'])) { |
|
12 |
|
|
13 |
foreach ($_POST as $value) //Protection des variables POST. |
|
14 |
{ |
|
15 |
$value = htmlspecialchars($value); |
|
16 |
} |
|
8 |
// tableau de vérification de conformité |
|
9 |
$params = array('title' => array('name' => 'titre', |
|
10 |
'pattern' => '^.{1,50}$', |
|
11 |
'required' => true), |
|
12 |
'latitude' => array('name' => 'latitude', |
|
13 |
'type' => 'numeric', |
|
14 |
'min' => -180, |
|
15 |
'max' => 180, |
|
16 |
'required' => true), |
|
17 |
'longitude' => array('name' => 'longitude', |
|
18 |
'type' => 'numeric', |
|
19 |
'min' => -180, |
|
20 |
'max' => 180, |
|
21 |
'required' => true), |
|
22 |
'altitude' => array('name' => 'altitude', |
|
23 |
'type' => 'numeric', |
|
24 |
'min' => -180, |
|
25 |
'max' => 180, |
|
26 |
'required' => true), |
|
27 |
'loop' => array('name' => 'image_loop', |
|
28 |
'type' => 'boolean', |
|
29 |
'required' => false), |
|
30 |
'dir' => array('required' => true), |
|
31 |
'panorama' => array('required' => true)); |
|
32 |
$wrong = array(); |
|
33 |
$values = array(); |
|
34 |
// vérification de la conformité |
|
35 |
foreach($params as $param => $check) { |
|
36 |
if (isset($_REQUEST['param_'.$param])) { |
|
37 |
$tst = $_REQUEST['param_'.$param]; |
|
38 |
if ((isset($check['min']) || isset($check['max'])) && ! is_numeric($tst)) $wrong[$param] = "<em>$tst</em> ne correspond pas à une valeur numérique"; |
|
39 |
else if (isset($check['min']) && $tst < $check['min']) $wrong[$param] = "<em>$tst</em> trop bas"; |
|
40 |
else if (isset($check['max']) && $tst > $check['max']) $wrong[$param] = "<em>$tst</em> trop haut"; |
|
41 |
else if (isset($check['pattern']) && preg_match('/'.preg_quote($check['pattern']).'/', $tst)) $wrong[$param] = "<em>$tst</em> non conforme"; |
|
42 |
else $values[$param] = $tst; |
|
43 |
} else if (isset($check['required']) && $check['required']) { |
|
44 |
$wrong[$param] = '<em>$tst</em> est un paramètre manquant'; |
|
45 |
} |
|
46 |
} |
|
17 | 47 |
|
18 |
/* --- Vérification des inputs avec des regex. ---*/ |
|
19 |
// Pour la latitude : ( Le javascript bride entre -90 et 90) |
|
20 |
if (preg_match("#^(\-?[1-9]+[0-9]?[.,]{0,1}[0-9]{0,6}|\-?[0-9]{1}[.,]{0,1}[0-9]{0,6})$#", $_POST['param_latitude'])) |
|
21 |
{ |
|
22 |
$lat = $_POST['param_latitude']; |
|
23 |
//echo 'Le ' . $_POST['param_latitude'] . ' est un numéro <strong>valide</strong> !'; |
|
24 |
} |
|
25 |
else |
|
26 |
{ |
|
27 |
echo 'Le ' . $_POST['param_latitude'] . ' n\'est pas valide, recommencez !'; |
|
28 |
|
|
29 |
} |
|
30 |
|
|
31 |
// Pour la longitude : ( Le javascript bride entre -180 et 180) |
|
32 |
if (preg_match("#^(\-?[1-9]+[0-9]?[.,]{0,1}[0-9]{0,6}|\-?[0-9]{0,1}[.,]{1}[0-9]{0,6})$#", $_POST['param_longitude'])) |
|
33 |
{ |
|
34 |
$lon = $_POST['param_longitude']; |
|
35 |
//echo 'Le ' . $_POST['param_longitude'] . ' est un numéro <strong>valide</strong> !'; |
|
36 |
} |
|
37 |
else |
|
38 |
{ |
|
39 |
echo 'Le ' . $_POST['param_longitude'] . ' n\'est pas valide, recommencez !'; |
|
40 |
|
|
41 |
} |
|
42 |
|
|
43 |
// Pour l'altitude ( Le javascript bride entre 0 et 500) |
|
44 |
if (preg_match("#^([1-9]+[0-9]{0,4}|0)$#", $_POST['param_altitude'])) |
|
45 |
{ |
|
46 |
$alt = $_POST['param_altitude']; |
|
47 |
//echo 'Le ' . $_POST['param_altitude'] . ' est un numéro <strong>valide</strong> !'; |
|
48 |
} |
|
49 |
else |
|
50 |
{ |
|
51 |
echo 'Le ' . $_POST['param_altitude'] . ' n\'est pas valide, recommencez !'; |
|
52 |
|
|
53 |
} |
|
54 |
|
|
55 |
// Pour l'élévation ( Le javascript bride entre -10 et 10) |
|
56 |
if (preg_match("#^(\-?[1-9]+[0-9]?|0)$#", $_POST['param_elevation'])) |
|
57 |
{ |
|
58 |
$ele = $_POST['param_elevation']; |
|
59 |
//echo 'Le ' . $_POST['param_elevation'] . ' est un numéro <strong>valide</strong> !'; |
|
60 |
} |
|
61 |
else |
|
62 |
{ |
|
63 |
echo 'Le ' . $_POST['param_elevation'] . ' n\'est pas valide, recommencez !'; |
|
64 |
|
|
65 |
} |
|
66 |
|
|
67 |
$loop = $_POST['param_loop']; // Variable radio automatiquement présente |
|
68 |
if(isset($lat) && isset($lon) && isset($alt) && isset($ele) && isset($loop)) { |
|
69 |
|
|
70 |
// On recherche le dossier correspondant au panorama en question |
|
71 |
$dir_file = "/var/www/data/tsf2/vpongnian/panorama/".$_GET['dir']."/".$_GET['panorama']; |
|
72 |
$dir_open = opendir($dir_file); |
|
73 |
while (false !== ($file = readdir($dir_open))) { |
|
74 |
// Si on trouve bien des tuiles |
|
75 |
if (preg_match('/(.*)_[0-9]+_[0-9]+_[0-9]+\.jpg$/', $file, $reg)) { |
|
76 |
$prefix = $reg[1]; |
|
77 |
$new_param_file = $prefix.".params"; |
|
78 |
break; // On sort à la première tuile trouvée |
|
79 |
} |
|
80 |
} |
|
81 |
closedir($dir_open); |
|
82 |
|
|
83 |
$retour = "\n"; |
|
84 |
// On vérifie qu'on a bien crée un nouveau fichier .params et on écrit dedans. |
|
85 |
if(isset($new_param_file)){ |
|
86 |
$param_file = fopen($dir_file."/".$new_param_file,'a+'); |
|
87 |
fputs($param_file,"titre = \"" . $_POST['param_title'] . "\""); |
|
88 |
fputs($param_file,$retour); |
|
89 |
fputs($param_file,"latitude = " . $lat); |
|
90 |
fputs($param_file,$retour); |
|
91 |
fputs($param_file,"longitude = " . $lon); |
|
92 |
fputs($param_file,$retour); |
|
93 |
fputs($param_file,"altitude = " . $alt); |
|
94 |
fputs($param_file,$retour); |
|
95 |
fputs($param_file,"elevation = " . $alt); |
|
96 |
fputs($param_file,$retour); |
|
97 |
fputs($param_file,"image_loop =" . $loop); |
|
98 |
fputs($param_file,$retour); |
|
99 |
fclose($param_file); |
|
100 |
|
|
101 |
echo 'Paramétrage OK. Retour au panorama'; |
|
102 |
header("Refresh: 1; URL=index.php"); |
|
103 |
} else { |
|
104 |
|
|
105 |
echo "<script>alert(\"impossible d'écrire dans le fichier\")</script>"; |
|
106 |
} |
|
107 |
} |
|
48 |
if (isset($values['panorama'])) { |
|
49 |
$back_url = sprintf('panorama.php?panorama=%s', $values['panorama']); |
|
50 |
if (isset($values['dir'])) $back_url .= '&dir='. $values['dir']; |
|
51 |
} else { |
|
52 |
$back_url = '.'; |
|
53 |
} |
|
54 |
|
|
55 |
if (count($wrong) == 0) { |
|
56 |
// On recherche le dossier correspondant au panorama en question |
|
57 |
$dir_file = "./".$values['dir']."/".$values['panorama']; |
|
58 |
$dir_open = opendir($dir_file); |
|
59 |
while (false !== ($file = readdir($dir_open))) { |
|
60 |
// Si on trouve bien des tuiles |
|
61 |
if (preg_match('/(.*)_[0-9]+_[0-9]+_[0-9]+\.jpg$/', $file, $reg)) { |
|
62 |
$prefix = $reg[1]; |
|
63 |
$new_param_file = $prefix.".params"; |
|
64 |
break; // On sort à la première tuile trouvée |
|
65 |
} |
|
66 |
} |
|
67 |
closedir($dir_open); |
|
68 |
|
|
69 |
// On vérifie qu'on a bien créée un nouveau fichier .params et on écrit dedans. |
|
70 |
if(isset($new_param_file)){ |
|
71 |
$fid = fopen($dir_file."/".$new_param_file,'a+'); |
|
72 |
echo '<p>Les valeurs suivantes sont utilisées.</p>'."\n"; |
|
73 |
echo "<dl>\n"; |
|
74 |
foreach ($values as $k => $v) { |
|
75 |
echo "$k -$v<br/>\n"; |
|
76 |
if (isset($params[$k]['name'])) { |
|
77 |
$nm = $params[$k]['name']; |
|
78 |
if (isset($params[$k]['type']) && $params[$k]['type'] == 'numeric') { |
|
79 |
$vf = $v; |
|
80 |
} else if (isset($params[$k]['type']) && $params[$k]['type'] == 'boolean') { |
|
81 |
$vf = $v ? "true" : "false"; |
|
108 | 82 |
} else { |
109 |
echo '<script>alert(\'$_POST manquant\')</script>'; |
|
110 |
header("Refresh: 2; URL=javascript:history.back();"); |
|
83 |
$vf = "\"$v\""; |
|
111 | 84 |
} |
112 |
} else { |
|
113 |
echo '<script>alert(\'La destinaton est manquante\')</script>'; |
|
114 |
header("Refresh: 2; URL=javascript:history.back();"); |
|
85 |
fputs($fid, "$nm = $vf\n"); |
|
86 |
printf("<dt>%s</dt>\n<dd>%s</dd>\n", $nm, $vf); |
|
87 |
} |
|
88 |
} |
|
89 |
echo "</dl>\n"; |
|
90 |
fclose($fid); |
|
91 |
echo '<p class="succes">Paramétrage terminé.</p>'."\n"; |
|
92 |
} else { |
|
93 |
printf("<p class=\"error\">impossible d'écrire dans le fichier '%s'</p>\n", $dir_file); |
|
94 |
} |
|
95 |
} else { |
|
96 |
echo '<p class="error">Les valeurs suivantes sont incorrectes.</p>'."\n"; |
|
97 |
echo "<dl>\n"; |
|
98 |
foreach ($wrong as $k => $v) { |
|
99 |
printf("<dt>%s</dt>\n<dd>%s</dd>\n", $k, $v); |
|
100 |
} |
|
101 |
echo "</dl>\n"; |
|
115 | 102 |
} |
103 |
printf('<a href="%s">Retour au panorama</a></p>'."\n", $back_url); |
|
116 | 104 |
|
117 | 105 |
?> |
118 | 106 |
</html> |
class/site_point.class.php | ||
---|---|---|
7 | 7 |
private $zooms; |
8 | 8 |
|
9 | 9 |
public function __construct($dir) { |
10 |
// si $dir n'est pas un répertoire il ne s'agit pas d'un panorama. |
|
11 |
if (!is_dir($dir)) return; |
|
10 | 12 |
$this->base_dir = $dir; |
11 | 13 |
$dir_fd = opendir($this->base_dir); |
12 | 14 |
|
... | ... | |
80 | 82 |
|
81 | 83 |
$e = atan2(($alt2 - $alt1)/1000 - $d*$d/(2*$rt), $d); // angle de l'élévation en radians |
82 | 84 |
// printf("%s, %s, %s, %s\n",$lat1, $this->params['latitude'], $lat, $dLat); |
83 |
|
|
84 |
return array($d, $cap*180/M_PI, $e*180/M_PI, $rapport); // les résultats sont en degrés |
|
85 |
return array($d, $cap*180/M_PI, $e*180/M_PI); // les résultats sont en degrés |
|
85 | 86 |
} |
86 | 87 |
|
87 | 88 |
} |
class/sites_dir.class.php | ||
---|---|---|
4 | 4 |
|
5 | 5 |
public function __construct($dir) { |
6 | 6 |
$this->base_dir = $dir; |
7 |
}
|
|
7 |
} |
|
8 | 8 |
|
9 | 9 |
public function get_sites() { |
10 |
try |
|
11 |
{ |
|
12 |
$dir_fd = opendir($this->base_dir); |
|
13 |
} |
|
14 |
catch(Exception $e) |
|
15 |
{ |
|
16 |
die('Erreur : '.$e->getMessage()); |
|
17 |
} |
|
18 |
|
|
19 |
|
|
10 |
$dir_fd = @opendir($this->base_dir); |
|
11 |
|
|
20 | 12 |
$point_list = array(); |
21 | 13 |
while (false !== ($point_dir = readdir($dir_fd))) { |
22 | 14 |
$pt = new site_point($this->base_dir.'/'.$point_dir); |
... | ... | |
26 | 18 |
} |
27 | 19 |
|
28 | 20 |
public function get_dir() { |
29 |
return $this->base_dir;
|
|
21 |
return $this->base_dir;
|
|
30 | 22 |
} |
31 |
|
|
32 | 23 |
} |
class/utils.class.php | ||
---|---|---|
1 |
<?php |
|
2 |
|
|
3 |
abstract class utils { |
|
4 |
static public function init() { |
|
5 |
function __autoload($class) { |
|
6 |
$class_loc = 'class/'.$class.'.class.php'; |
|
7 |
if (is_readable($class_loc)) { |
|
8 |
require_once($class_loc); |
|
9 |
} |
|
10 |
} |
|
11 |
|
|
12 |
function errorToException($code, $msg, $file, $line) { |
|
13 |
throw new Exception($msg); |
|
14 |
} |
|
15 |
set_error_handler('errorToException'); |
|
16 |
} |
|
17 |
|
|
18 |
} |
creerPano.php | ||
---|---|---|
1 |
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> |
|
2 |
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr"> |
|
3 |
<head> |
|
4 |
<meta http-equiv="Content-type" content="text/html; charset=UTF-8"/> |
|
5 |
<link rel="stylesheet" media="screen" href="css/ttn_style_1.css" /> |
|
6 |
<title>creation d'un panoramique</title> |
|
7 |
<script type="text/javascript"> |
|
8 |
|
|
9 |
function showLoad(outgoingLink){ |
|
10 |
|
|
11 |
var link = document.getElementById(outgoingLink); |
|
12 |
var loader = document.createElement('img'); |
|
13 |
loader.id = 'loader'; |
|
14 |
loader.src ='images/loader2.gif'; |
|
15 |
var li = link.parentNode; |
|
16 |
li.appendChild(loader); |
|
17 |
} |
|
18 |
</script> |
|
19 |
</head> |
|
20 |
<body> |
|
21 |
<img id="top" src="images/top.png" alt=""> |
|
22 |
<div id="page_container"> |
|
23 |
<h1><img src="images/tetaneutral.png"></h1> |
|
24 |
<h2>Listes des photos sur le serveur</h2> |
|
25 |
<p>Cliquez pour générer un panorama</p> |
|
26 |
<div id="containerList"> |
|
27 |
<ul> |
|
28 |
|
|
29 |
<?php |
|
30 |
|
|
31 |
$base_dir = "/var/www/data/tsf2/vpongnian/panorama/upload/"; // modifier selon l'arborescence. |
|
32 |
try |
|
33 |
{ |
|
34 |
// On ouvre le dossier ou se trouve les images |
|
35 |
$dir_fd = opendir($base_dir); |
|
36 |
|
|
37 |
$i=0; // Garantir l'unicité du id des liens. |
|
38 |
while (false !== ($image_name = readdir($dir_fd))) { |
|
39 |
$dir = $base_dir.$image_name; |
|
40 |
|
|
41 |
if ($image_name != "." && $image_name != "..") // N'affiche pas les répertoires parents et courant. |
|
42 |
{ |
|
43 |
printf('<li><a href="genererPano.php?name=%s" id="link_'.$i.'" onclick="showLoad(this.id);return true;">%s</a></li>'."\n",$image_name,$image_name); |
|
44 |
$i++; |
|
45 |
} |
|
46 |
|
|
47 |
|
|
48 |
} |
|
49 |
} |
|
50 |
catch(Exception $e) |
|
51 |
{ |
|
52 |
die('Erreur : '.$e->getMessage()); |
|
53 |
} |
|
54 |
?> |
|
55 |
</ul> |
|
56 |
</div> |
|
57 |
<div id="footer"><a href="./index.php">Retour à l'index</a></div> |
|
58 |
|
|
59 |
</div> |
|
60 |
<img id="bottom" src="images/bottom.png" alt=""> |
|
61 |
</body> |
|
62 |
</html> |
css/index_style.css | ||
---|---|---|
1 |
body |
|
2 |
{ |
|
3 |
|
|
4 |
background:#44F; |
|
5 |
font-family:"Lucida Grande", Tahoma, Arial, Verdana, sans-serif; |
|
6 |
font-size:small; |
|
7 |
margin:8px 0 16px; |
|
8 |
text-align:center; |
|
9 |
overflow:auto; |
|
10 |
|
|
11 |
} |
|
12 |
|
|
13 |
#top |
|
14 |
{ |
|
15 |
display:block; |
|
16 |
height:10px; |
|
17 |
margin:10px auto 0; |
|
18 |
width:650px; |
|
19 |
} |
|
20 |
|
|
21 |
div#index_container |
|
22 |
{ |
|
23 |
background:#fff; |
|
24 |
|
|
25 |
margin: auto; |
|
26 |
text-align:left; |
|
27 |
width:640px; |
|
28 |
} |
|
29 |
|
|
30 |
div#index_container h2 { |
|
31 |
margin:1.05em; |
|
32 |
text-shadow: 0.1em 0.1em 0.15em #44F; |
|
33 |
} |
|
34 |
#bottom |
|
35 |
{ |
|
36 |
display:block; |
|
37 |
height:10px; |
|
38 |
margin:0 auto; |
|
39 |
width:650px; |
|
40 |
} |
|
41 |
|
|
42 |
h1 |
|
43 |
{ |
|
44 |
background-color:#6699CC; |
|
45 |
margin:0; |
|
46 |
min-height:0; |
|
47 |
padding:0; |
|
48 |
text-decoration:none; |
|
49 |
text-align: center; |
|
50 |
|
|
51 |
} |
|
52 |
|
|
53 |
h1 a |
|
54 |
{ |
|
55 |
|
|
56 |
display:block; |
|
57 |
height:100%; |
|
58 |
min-height:40px; |
|
59 |
|
|
60 |
} |
|
61 |
|
|
62 |
h1 img |
|
63 |
{ |
|
64 |
margin-top: 8px; |
|
65 |
} |
|
66 |
|
|
67 |
img |
|
68 |
{ |
|
69 |
/*behavior:url(css/iepngfix.htc);*/ |
|
70 |
border:none; |
|
71 |
} |
|
72 |
|
|
73 |
div#containerList |
|
74 |
{ |
|
75 |
margin:20px 20px 0; |
|
76 |
padding:0 0 20px; |
|
77 |
} |
|
78 |
|
|
79 |
#containerList |
|
80 |
{ |
|
81 |
font-family:Lucida Grande, Tahoma, Arial, Verdana, sans-serif; |
|
82 |
|
|
83 |
} |
|
84 |
|
|
85 |
#containerList li |
|
86 |
{ |
|
87 |
width:100%; |
|
88 |
margin:1.05em; |
|
89 |
font-size:14px; |
|
90 |
|
|
91 |
} |
|
92 |
|
|
93 |
div#containerList ul |
|
94 |
{ |
|
95 |
font-size:100%; |
|
96 |
list-style-type:circle; |
|
97 |
margin:0; |
|
98 |
padding:0; |
|
99 |
width:100%; |
|
100 |
} |
|
101 |
|
|
102 |
div#interaction { |
|
103 |
background-color:#fff; |
|
104 |
margin: auto; |
|
105 |
width:640px; |
|
106 |
border-top: 2px dotted #44F; |
|
107 |
} |
|
108 |
|
|
109 |
div#interaction li{ |
|
110 |
|
|
111 |
display:inline-block; |
|
112 |
list-style-type:none; |
|
113 |
margin:1.08em; |
|
114 |
|
|
115 |
} |
|
116 |
|
|
117 |
div#interaction li a{ |
|
118 |
|
|
119 |
color:#3F2DFF; |
|
120 |
text-decoration:none; |
|
121 |
font-size:16px; |
|
122 |
} |
|
123 |
|
|
124 |
div#interaction li a:hover { |
|
125 |
color:#FF9900; |
|
126 |
text-decoration:underline; |
|
127 |
} |
|
128 |
|
|
129 |
|
|
130 |
|
|
131 |
p a { |
|
132 |
background-color:#fff; |
|
133 |
border-radius: 4px; |
|
134 |
padding:3px; |
|
135 |
text-shadow: 0.1em 0.05em 0.15em #444; |
|
136 |
font-size:11px; |
|
137 |
} |
|
1 |
* { |
|
2 |
margin:0; |
|
3 |
padding:0; |
|
4 |
font-family:Arial, Verdana, sans-serif; |
|
5 |
} |
|
6 |
|
|
7 |
body { |
|
8 |
background-color:#44F; |
|
9 |
text-align:center; |
|
10 |
width:50rem; |
|
11 |
margin:auto; |
|
12 |
} |
|
13 |
|
|
14 |
header { |
|
15 |
margin:1rem 0; |
|
16 |
box-shadow:0 0 0.5rem 0 #000; |
|
17 |
background-color:#69C; |
|
18 |
} |
|
19 |
|
|
20 |
h1 { |
|
21 |
text-align:center; |
|
22 |
padding:0.2rem; |
|
23 |
} |
|
24 |
|
|
25 |
img {vertical-align:middle} |
|
26 |
|
|
27 |
h2 { |
|
28 |
padding:0.5em 1em; |
|
29 |
text-shadow: 0.1em 0.1em 0.15em #44F; |
|
30 |
} |
|
31 |
|
|
32 |
#main { |
|
33 |
box-shadow:0 0 0.5rem 0 #000; |
|
34 |
text-align:left; |
|
35 |
background-color:#FFF; |
|
36 |
} |
|
37 |
|
|
38 |
#main a {text-decoration:none} |
|
39 |
|
|
40 |
#pano-list li samp:after { |
|
41 |
padding-left:1em; |
|
42 |
content:'fichier non configuré'; |
|
43 |
font-weight:bold; |
|
44 |
color:#F00; |
|
45 |
} |
|
46 |
#pano-list li { |
|
47 |
list-style-type:circle; |
|
48 |
list-style-position:inside; |
|
49 |
border:dashed #777 0; |
|
50 |
border-top-width:0.1em; |
|
51 |
padding:0.3em 1em; |
|
52 |
} |
|
53 |
|
|
54 |
#pano-list li:nth-child(6n), |
|
55 |
#pano-list li:nth-child(6n+1), |
|
56 |
#pano-list li:nth-child(6n+2) { |
|
57 |
background-color:#FFE; |
|
58 |
} |
|
59 |
|
|
60 |
#pano-list li:nth-child(6n+3), |
|
61 |
#pano-list li:nth-child(6n+4), |
|
62 |
#pano-list li:nth-child(6n+5) { |
|
63 |
background-color:#FEF; |
|
64 |
} |
|
65 |
|
|
66 |
#interaction { |
|
67 |
text-align:center; |
|
68 |
border:solid #777 0; |
|
69 |
border-top-width:0.1em; |
|
70 |
padding:0.5em 0; |
|
71 |
} |
|
72 |
|
|
73 |
#interaction a { |
|
74 |
padding:1em; |
|
75 |
} |
|
76 |
|
|
77 |
#interaction a:hover { |
|
78 |
color:#F90; |
|
79 |
text-decoration:underline; |
|
80 |
} |
|
81 |
|
|
82 |
footer { |
|
83 |
margin:1rem 0 |
|
84 |
} |
|
85 |
|
|
86 |
.validators a { |
|
87 |
background-color:#fff; |
|
88 |
border-radius: 0.4rem; |
|
89 |
padding:0.3ex; |
|
90 |
text-shadow: 0.1em 0.05em 0.15em #444; |
|
91 |
} |
css/map.css | ||
---|---|---|
1 | 1 |
* { |
2 |
font-family:Arial, Verdana, sans-serif; |
|
2 | 3 |
padding:0; |
3 | 4 |
margin:0; |
4 | 5 |
} |
... | ... | |
49 | 50 |
cursor:default; |
50 | 51 |
} |
51 | 52 |
|
52 |
fieldset#control { |
|
53 |
text-shadow:2px 2px 2px #000, -2px -2px 2px #000; |
|
54 |
color:#FFF; |
|
55 |
float:left; |
|
56 |
position:absolute; |
|
57 |
top:1em; |
|
58 |
left:2em; |
|
59 |
background-color:rgba(128,128,128,0.5); |
|
60 |
border:solid #F00 1px; |
|
61 |
border-radius:0.5em; |
|
62 |
padding:0.2em 0.5em; |
|
63 |
} |
|
53 |
img {vertical-align:middle} |
|
64 | 54 |
|
65 | 55 |
input { |
66 | 56 |
vertical-align:middle; |
67 | 57 |
} |
68 | 58 |
|
69 |
|
|
70 | 59 |
input[type="number"] { |
71 | 60 |
border-radius:1em; |
72 | 61 |
display:block; |
73 | 62 |
float:right; |
63 |
width:10ex; |
|
74 | 64 |
} |
75 | 65 |
|
76 |
#locadraw input[type="number"] { |
|
77 |
width:10ex; |
|
66 |
input[type="submit"], |
|
67 |
input[type="reset"], |
|
68 |
input[type="button"] { |
|
69 |
border-radius:0.4rem; |
|
70 |
padding:0.2em 1em; |
|
71 |
margin:0.2em; |
|
78 | 72 |
} |
79 | 73 |
|
80 |
#res>:not(ul), #control, #params, #info ,#addParams ,#adding, #loca{ |
|
81 |
user-select:none; |
|
82 |
-khtml-user-select:none; |
|
83 |
-o-user-select:none; |
|
84 |
-moz-user-select:-moz-none; |
|
85 |
-webkit-user-select:none; |
|
74 |
input[type="checkbox"] { |
|
75 |
margin:0 1em; |
|
86 | 76 |
} |
87 | 77 |
|
88 |
div#params {
|
|
89 |
padding:0.2em 1.3em;
|
|
78 |
#params { |
|
79 |
padding:0.2em 0.5em;
|
|
90 | 80 |
border-radius:0.5em; |
91 | 81 |
background-color:rgba(128,128,128,0.5); |
92 | 82 |
border:solid #00F 1px; |
93 | 83 |
position:absolute; |
94 | 84 |
top:1em; |
95 | 85 |
right:2em; |
96 |
float:right; |
|
86 |
min-width:10em; |
|
87 |
color:#FFF; |
|
97 | 88 |
} |
98 | 89 |
|
99 |
div#params em { |
|
100 |
|
|
90 |
#params em { |
|
101 | 91 |
display:block; |
102 | 92 |
float:right; |
103 | 93 |
background-color:#88F; |
104 | 94 |
border-radius:0.5em; |
105 | 95 |
padding:0 0.5em; |
106 |
color:#FFF; |
|
107 |
} |
|
108 |
|
|
109 |
div#params em:nth-child[2] { |
|
110 |
display:inline; |
|
96 |
color:#FF0; |
|
111 | 97 |
} |
112 | 98 |
|
113 |
span#loca{
|
|
114 |
text-shadow:2px 2px 2px #000, -2px -2px 2px #000;
|
|
99 |
#loca_show {
|
|
100 |
text-shadow:2px 2px 2px #000, -2px -2px 2px #000;
|
|
115 | 101 |
color:#FFF; |
116 | 102 |
float:left; |
117 | 103 |
position:absolute; |
... | ... | |
122 | 108 |
padding:0 1em; |
123 | 109 |
} |
124 | 110 |
|
125 |
|
|
126 |
div#addParams { |
|
127 |
text-shadow:2px 2px 2px #000, -2px -2px 2px #000; |
|
111 |
#addParams { |
|
112 |
text-shadow:2px 2px 2px #000, -2px -2px 2px #000; |
|
128 | 113 |
color:#FFF; |
129 |
float:left; |
|
130 | 114 |
position:absolute; |
131 | 115 |
top:1em; |
132 | 116 |
right:2em; |
133 |
|
|
134 | 117 |
border:solid #F00 1px; |
135 | 118 |
border-radius:0.5em; |
136 | 119 |
padding:0.2em 0.5em; |
137 | 120 |
background-color:#F88; |
138 |
padding:0 1em; |
|
139 |
|
|
121 |
padding:0 1em; |
|
140 | 122 |
} |
141 | 123 |
|
142 |
div#addParams label { |
|
143 |
|
|
124 |
#addParams label { |
|
144 | 125 |
border-radius:0.5em; |
145 | 126 |
padding:0 1em; |
146 | 127 |
} |
147 | 128 |
|
148 |
div#addParams label:hover { |
|
149 |
color: #FF0; |
|
150 |
|
|
129 |
#addParams label:hover { |
|
130 |
color: #FF0; |
|
151 | 131 |
} |
152 | 132 |
|
153 |
fieldset#locadraw { |
|
154 |
|
|
133 |
fieldset { |
|
134 |
border:solid #F00 1px; |
|
135 |
border-radius:0.5em; |
|
136 |
padding:0 0.5em; |
|
155 | 137 |
color:#FFF; |
156 |
float:left; |
|
157 | 138 |
position:absolute; |
139 |
background-color:rgba(128,128,128,0.5); |
|
140 |
} |
|
141 |
|
|
142 |
fieldset#control { |
|
143 |
top:1em; |
|
144 |
left:2em; |
|
145 |
padding:0.2em 0.5em; |
|
146 |
} |
|
147 |
|
|
148 |
|
|
149 |
fieldset#locadraw { |
|
158 | 150 |
bottom:1em; |
159 | 151 |
left:1em; |
160 |
background-color:rgba(128,128,128,0.5); |
|
161 |
border:solid #F00 1px; |
|
162 |
border-radius:0.5em; |
|
163 |
padding:0 1em; |
|
164 | 152 |
visibility:hidden; |
153 |
min-width:10em; |
|
165 | 154 |
} |
166 | 155 |
|
167 | 156 |
fieldset#adding { |
168 |
|
|
169 |
color:#FFF; |
|
170 |
float:left; |
|
171 |
position:absolute; |
|
172 | 157 |
top:1em; |
173 | 158 |
right:2em; |
174 |
background-color:rgba(128,128,128,0.5); |
|
175 |
border:solid #F00 1px; |
|
176 |
border-radius:0.5em; |
|
177 |
padding:0 1em; |
|
178 | 159 |
visibility: hidden; |
179 | 160 |
} |
180 | 161 |
|
181 |
|
|
182 |
|
|
183 |
form#form_param label { |
|
184 |
|
|
185 |
margin-right: 15px; |
|
186 |
width: 0.5em; |
|
187 |
padding:0.3em 0.5em; |
|
188 |
min-height: 1px; |
|
189 |
text-align: left; |
|
162 |
#form_param label { |
|
190 | 163 |
text-shadow:2px 2px 2px #000, -2px -2px 2px #000; |
191 | 164 |
} |
192 | 165 |
|
193 | 166 |
|
194 | 167 |
input:focus { |
195 |
border-color: rgba(82, 168, 236, 0.75); |
|
196 |
-moz-box-shadow: 0 0 8px rgba(82, 168, 236, 0.5); |
|
197 |
-webkit-box-shadow: 0 0 8px rgba(82, 168, 236, 0.5); |
|
198 |
box-shadow: 0 0 8px rgba(82, 168, 236, 0.5); |
|
199 |
} |
|
200 |
|
|
201 |
.correct { |
|
202 |
border-color: rgba(68, 191, 68, 0.75); |
|
168 |
background-color:#004; |
|
169 |
color:#FFF; |
|
170 |
border-color:#F00; |
|
203 | 171 |
} |
204 | 172 |
|
205 |
.correct:focus { |
|
206 |
border-color: rgba(68, 191, 68, 0.75); |
|
207 |
-moz-box-shadow: 0 0 8px rgba(68, 191, 68, 0.5); |
|
208 |
-webkit-box-shadow: 0 0 8px rgba(68, 191, 68, 0.5); |
|
209 |
box-shadow: 0 0 8px rgba(68, 191, 68, 0.5); |
|
210 |
} |
|
211 |
|
|
212 |
.incorrect { |
|
213 |
border-color: rgba(191, 68, 68, 0.75); |
|
214 |
} |
|
215 |
|
|
216 |
.incorrect:focus { |
|
217 |
border-color: rgba(191, 68, 68, 0.75); |
|
218 |
-moz-box-shadow: 0 0 8px rgba(191, 68, 68, 0.5); |
|
219 |
-webkit-box-shadow: 0 0 8px rgba(191, 68, 68, 0.5); |
|
220 |
box-shadow: 0 0 8px rgba(191, 68, 68, 0.5); |
|
221 |
} |
|
222 |
|
|
223 |
/*p#chsignInfo { |
|
224 |
color:#F00; |
|
225 |
font-size: 12px; |
|
226 |
margin:1.02em 1em; |
|
227 |
background-color: #CCC; |
|
228 |
border-radius: 4px; |
|
229 |
padding:2px; |
|
230 |
}*/ |
|
231 |
|
|
232 |
.answer { |
|
233 |
margin:0.2em 0; |
|
234 |
display:block; |
|
235 |
} |
|
236 |
|
|
237 |
.answer input { |
|
238 |
border-radius:0.5rem; |
|
239 |
padding:0.2em 0.7em; |
|
240 |
} |
|
241 |
|
|
242 |
.form_button { |
|
243 |
background-color:rgba(128,128,128,0.9); |
|
244 |
/*background: url(button.png) no-repeat top;*/ |
|
245 |
display:inline-block; |
|
246 |
} |
|
247 |
|
|
248 | 173 |
.validators { |
249 | 174 |
text-align:center; |
250 |
background-color:#CCC;
|
|
175 |
background-color:rgba(50%,50%,50%,0.5);
|
|
251 | 176 |
border:solid 1px #F55; |
252 |
border-width:0 0 1px 0; |
|
253 |
display:none; |
|
177 |
border-radius:0.5em; |
|
178 |
border-width:1px; |
|
179 |
position:absolute; |
|
180 |
bottom:1em; |
|
181 |
left:45%; |
|
182 |
padding:0.2em 0.5em; |
|
183 |
font-size:80%; |
|
254 | 184 |
} |
255 | 185 |
|
186 |
.validators img {height:1em} |
|
187 |
|
|
256 | 188 |
#res { |
257 | 189 |
padding:0.2em 0.4em; |
258 | 190 |
color:#FF8; |
... | ... | |
263 | 195 |
border:solid #FFF 1px; |
264 | 196 |
} |
265 | 197 |
|
266 |
#res:empty {padding:0;}
|
|
198 |
#res:empty {display:none}
|
|
267 | 199 |
|
268 | 200 |
#res li { |
269 | 201 |
list-style-type: none; |
270 | 202 |
color:#FFF; |
271 | 203 |
background-color:rgba(100,0,0,0.5); |
272 |
|
|
273 | 204 |
} |
description | ||
---|---|---|
1 |
Système de visualisateton et de parcours des panoramas via le Web. |
envoyer.php | ||
---|---|---|
1 |
<?php $uid = md5(uniqid(rand())); ?> |
|
2 |
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> |
|
1 |
<!DOCTYPE html> |
|
3 | 2 |
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr"> |
4 |
<head> |
|
5 |
|
|
6 |
<meta http-equiv="Content-type" content="text/html; charset=UTF-8"/> |
|
7 |
<link type="image/x-icon" rel="shortcut icon" href="images/tsf.png"/> |
|
8 |
<link rel="stylesheet" media="screen" href="css/view.css" /> |
|
9 |
<title>Upload d'une image sur le serveur !</title> |
|
10 |
<!-- suivi de l'upload par ajax. Peut être utile pour certains navigateurs qui ne renseigne pas l'avancement. |
|
11 |
<script type="text/javascript"> |
|
12 |
var HttpRequestObject = false; |
|
13 |
if(window.XMLHttpRequest) { |
|
14 |
HttpRequestObject = new XMLHttpRequest(); |
|
15 |
} |
|
16 |
else if(window.ActiveXObject) { |
|
17 |
HttpRequestObject = new ActiveXObject("Microsoft.XMLHTTP"); |
|
18 |
} |
|
19 |
|
|
20 |
function startProgress(uid) { |
|
21 |
|
|
22 |
|
|
23 |
<!--document.getElementById('upload').style.display = 'none';--> |
|
24 |
document.getElementById('pb_outer').style.display = 'block'; |
|
25 |
setTimeout('getProgress("' + uid + '")', 1000); |
|
26 |
|
|
27 |
|
|
28 |
|
|
29 |
} |
|
30 |
function getProgress(uid) { |
|
31 |
if(HttpRequestObject) { |
|
32 |
HttpRequestObject.open('GET', 'getprogress.php?uid=' + uid, true); |
|
33 |
HttpRequestObject.onreadystatechange = function() { |
|
34 |
if(HttpRequestObject.readyState == 4 && HttpRequestObject.status == 200) { |
|
35 |
var response = HttpRequestObject.responseText; |
|
36 |
var elem = response.split('#'); |
|
37 |
var progress = elem[0]; |
|
38 |
var url =elem[1]; |
|
39 |
var message=elem[2]; |
|
40 |
|
|
41 |
document.getElementById('pb_inner').style.width = progress + '%'; |
|
42 |
document.getElementById('pb_inner').innerHTML = progress + '%'; |
|
43 |
|
|
44 |
if(progress < 100) { |
|
45 |
|
|
46 |
setTimeout('getProgress("' + uid + '")', 100); |
|
47 |
|
|
48 |
} else { |
|
49 |
if(message !=='') { |
|
50 |
document.getElementById('pb_outer').style.display = 'none'; |
|
51 |
document.getElementById('pb_inner').style.width = 'none'; |
|
52 |
alert(message); |
|
53 |
} else { |
|
54 |
document.getElementById('pb_inner').innerHTML = 'Upload Complete!'; |
|
55 |
document.location.href= url; |
|
56 |
} |
|
57 |
} |
|
58 |
} |
|
59 |
} |
|
60 |
|
|
61 |
HttpRequestObject.send(null); |
|
62 |
} |
|
63 |
} |
|
64 |
|
|
65 |
function showLoader() { |
|
66 |
document.getElementById('loader').innerHTML = "Veuillez patienter ... "; |
|
67 |
|
|
68 |
|
|
69 |
} |
|
70 |
|
|
71 |
</script> |
|
72 |
</head> |
|
73 |
<body id="main_body"> |
|
74 |
<img id="top" src="images/top.png" alt=""> |
|
75 |
<div id="form_container"> |
|
76 |
<h1><img src="images/tetaneutral.png"></h1> |
|
77 |
|
|
78 |
<form onSubmit="startProgress('<?php echo $uid; ?>');" action="uploadTest.php" method="post" class="appnitro" enctype="multipart/form-data" name="upload" id="upload" target="upload_frame"> |
|
79 |
<h2>Ajouter un nouveau panorama</h2> |
|
80 |
|
|
81 |
<ul> |
|
82 |
<li id="li_1" > |
|
83 |
<label for="file" class="description">Envoyer le fichier :</label> |
|
84 |
<div> |
|
85 |
<input type="hidden" name="APC_UPLOAD_PROGRESS" id="progress_key" value="<?php echo $uid; ?>" /> |
|
86 |
<input type="file" name="file" id="file" /> |
|
87 |
</div> |
|
88 |
</li> |
|
89 |
|
|
90 |
<li class="buttons"> |
|
91 |
<input type="submit" name="submit" id="submit" value="Submit" /> |
|
92 |
</li> |
|
93 |
</ul> |
|
94 |
</form> |
|
95 |
<!-- Fin du formulaire --> |
|
96 |
<div id="footer"> |
|
97 |
<a href="./index.php">Retour liste</a> |
|
98 |
</div> |
|
99 |
</div> |
|
100 |
<div id="infoSize"> |
|
101 |
<img src="images/bulle.png" id="bulle"/> |
|
102 |
<label id="txtInfo">Le fichier à envoyer doit etre une image de type .tif ou .jpeg<br /> |
|
103 |
Taille maximale : 300 Mo</label> |
|
104 |
</div> |
|
105 |
<!-- Barre d'upload --> |
|
106 |
<div id="pb_outer"> |
|
107 |
<div id="pb_inner"></div> |
|
108 |
</div> |
|
109 |
<p id="info"></p> |
|
3 |
<head> |
|
4 |
<meta http-equiv="Content-type" content="text/html; charset=UTF-8"/> |
|
5 |
<link type="image/x-icon" rel="shortcut icon" href="images/tsf.png"/> |
|
6 |
<link rel="stylesheet" media="screen" href="css/view.css" /> |
|
7 |
<title>Envoi d'une image sur le serveur</title> |
|
8 |
</head> |
|
9 |
<body id="main_body"> |
|
10 |
<img id="top" src="images/top.png" alt=""> |
|
11 |
<div id="form_container"> |
|
12 |
<h1><img src="images/tetaneutral.svg"></h1> |
|
13 |
<form action="uploadReceive.php" method="post" enctype="multipart/form-data" id="upload"> |
|
14 |
<h2>Ajouter un nouveau panorama</h2> |
|
15 |
<ul> |
|
16 |
<li id="li_1" > |
|
17 |
<label for="file" class="description">Envoyer le fichier :</label> |
|
18 |
<div> |
|
19 |
<input type="hidden" name="APC_UPLOAD_PROGRESS" id="progress_key" value="panoramas"/> |
|
20 |
<input type="file" name="files[]" id="file" multiple="multiple" |
|
21 |
title="Le fichier à envoyer doit être une image de taille maximale 300 Mo"/> |
|
22 |
</div> |
|
23 |
</li> |
|
110 | 24 |
|
111 |
<iframe style="display: none" id="upload_frame" name="upload_frame"></iframe> |
|
112 |
|
|
113 |
<?php |
|
114 |
|
|
115 |
/******************************************************************* |
|
116 |
* Permet d'afficher l'image uploadée sur le serveur |
|
117 |
*******************************************************************/ |
|
118 |
|
|
119 |
if(isset($_GET['img']) && isset($_GET['dir'])){ |
|
120 |
|
|
121 |
apc_delete('link'); // Suppression de la variable cache. |
|
122 |
|
|
123 |
$image_name = htmlspecialchars($_GET['img']); |
|
124 |
$dir_image = htmlspecialchars($_GET['dir']); |
|
125 |
|
|
126 |
$basename = basename($_GET['img']); |
|
127 |
$filePartArr = explode('.', $basename); |
|
128 |
$ext = $filePartArr[count($filePartArr) - 1]; |
|
129 |
if($ext=="tif"){ |
|
130 |
$basename = basename($_GET['img'],".tif"); |
|
131 |
}else if($ext=="jpeg"){ |
|
132 |
$basename = basename($_GET['img'],".jpeg"); |
|
133 |
} else { |
|
134 |
$basename = basename($_GET['img'],".jpg"); |
|
135 |
} |
|
136 |
//Permet d'afficher l'image après uptload ( Conversion des .tiff et .jpg pour affichage dans le navigateur ) |
|
137 |
$input = 'convert /var/www/data/tsf2/vpongnian/panorama/upload/'.$_GET['img'].' -resize 10% /var/www/data/tsf2/vpongnian/panorama/upload/'.$basename.'.jpg'; // Adapter les chemins absolus ou relatifs |
|
138 |
$escaped_command = escapeshellcmd($input); |
|
139 |
$output = shell_exec($escaped_command); |
|
140 |
echo "<pre>$output</pre>\n"; |
|
141 |
|
|
142 |
?><div id="genererPano"> |
|
143 |
<form enctype="multipart/form-data" action="<?php echo "envoyer.php"/*htmlspecialchars($_SERVER['PHP_SELF'])*/; ?>" method="post" onSubmit="showLoader()"> |
|
144 |
<p> |
|
145 |
<label id="l_generer" for="no" title="Génerer le panoramique">Generer le panoramique :</label> |
|
146 |
<input type="hidden" name="image_name" value="<?php echo $image_name; ?>" /> |
|
147 |
<input type="submit" name="no" value="pas maintenant"/> |
|
148 |
<input type="submit" name="yes" value="oui" /> |
|
149 |
<label id="loader"></label> |
|
150 |
</p> |
|
151 |
</form> |
|
152 |
</div> |
|
153 |
<?php |
|
154 |
|
|
155 |
echo "<img src=/data/tsf2/vpongnian/panorama/upload/".$basename.".jpg id='imageUpload'/>"; |
|
156 |
} |
|
157 |
if (isset($_POST['no'])) { |
|
158 |
header("Location: ./index.php"); /* Redirection du navigateur */ |
|
159 |
exit; |
|
160 |
} |
|
161 |
if (isset($_POST['yes'])) { |
|
162 |
header("Location: ./genererPano.php?name=".$_POST['image_name']); |
|
163 |
exit; |
|
164 |
} |
|
165 |
?> |
|
166 |
|
|
25 |
<li class="buttons"> |
|
26 |
<input type="submit" name="submit" id="submit" value="Submit" /> |
|
27 |
</li> |
|
28 |
</ul> |
|
29 |
</form> |
|
30 |
<!-- Fin du formulaire --> |
|
31 |
<div id="footer"> |
|
32 |
<a href="./index.php">Retour liste</a> |
|
33 |
</div> |
|
34 |
</div> |
|
167 | 35 |
</body> |
168 |
</html> |
|
36 |
</html> |
genererPano.php | ||
---|---|---|
1 |
<?php |
|
2 |
if (isset($_GET['name'])) { |
|
3 |
// Protection de la variable GET |
|
4 |
$pano_name = htmlspecialchars($_GET['name']); |
|
5 |
$filePartArr = explode('.',$pano_name); |
|
6 |
$ext = $filePartArr[count($filePartArr) - 1]; |
|
7 |
if($ext=="tif"){ |
|
8 |
$pano_basename = basename($pano_name,".tif"); |
|
9 |
}else if($ext=="jpeg"){ |
|
10 |
$pano_basename = basename($pano_name,".jpeg"); |
|
11 |
} else { |
|
12 |
$pano_basename = basename($pano_name,".jpg"); |
|
13 |
} |
|
1 |
<!DOCTYPE html> |
|
2 |
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr"> |
|
3 |
<head> |
|
4 |
<meta http-equiv="Content-type" content="text/html; charset=UTF-8"/> |
|
5 |
<link type="image/x-icon" rel="shortcut icon" href="images/tsf.png"/> |
|
6 |
<title>convertiseur image vers panorama</title> |
|
7 |
</head> |
|
14 | 8 |
|
15 |
//Partie exécutante du script gen_tiles qui gènere les tuiles à partir d'une image. |
|
16 |
$input = './to_tiles/gen_tiles.sh -p '.$pano_basename.' /var/www/data/tsf2/vpongnian/panorama/upload/'.$pano_name; |
|
17 |
$escaped_command = escapeshellcmd($input); |
|
18 |
$output = shell_exec($escaped_command); |
|
19 |
$log_file = fopen('./log/'.$pano_basename.'.log','a+'); |
|
20 |
fputs($log_file, $output); // verbose intégré dans un .log. |
|
21 |
fclose($log_file); |
|
22 |
|
|
23 |
// Ouverture d'un nouveau dossier qui contiendra toutes les tuiles. |
|
24 |
$dir = '/var/www/data/tsf2/tiles/'.$pano_basename; |
|
25 |
|
|
26 |
mkdir($dir,0777); |
|
27 |
|
|
28 |
$dir_fd = opendir('/var/www/data/tsf2/vpongnian/panorama'); |
|
9 |
<?php |
|
10 |
require 'class/utils.class.php'; |
|
11 |
utils::init(); |
|
12 |
if (isset($_GET['name'])) { |
|
13 |
$pano_name = $_GET['name']; |
|
14 |
$pano_basename = preg_replace('/\.[^.]+$/', '', $pano_name); |
|
15 |
|
|
16 |
//Partie exécutante du script gen_tiles qui gènere les tuiles à partir d'une image. |
|
17 |
$panos_dir = 'tiles'; |
|
18 |
$pano_dest = $panos_dir.'/'.$pano_basename; |
|
19 |
if (! is_dir($panos_dir)) { |
|
20 |
echo "<p class=\"error\">le répertoire \"$panos_dir\" n'est pas accessible</p>\n"; |
|
21 |
} else if (file_exists($pano_dest)) { |
|
22 |
echo "<p class=\"error\">le nom de répertoire \"$pano_dest\" est déjà pris</p>\n"; |
|
23 |
} else { |
|
24 |
mkdir($pano_dest); |
|
25 |
$escaped_command = escapeshellcmd('./to_tiles/gen_tiles.sh -p '.$pano_dest.'/'.$pano_basename.' ./upload/'.$pano_name); |
|
29 | 26 |
|
30 |
while (false !== ($image_name = readdir($dir_fd))) { |
|
31 |
// Déplacement des tuiles dans le nouveau dossier à partir de dir_fd. |
|
32 |
if(preg_match('/(.*)_[0-9]+_[0-9]+_[0-9]+\.jpg$/', $image_name, $reg)) { |
|
33 |
rename("./".$image_name, $dir."/".$image_name); |
|
34 |
} |
|
35 |
|
|
36 |
} |
|
37 |
closedir($dir_fd); |
|
38 |
header("Location: ./index.php?"); |
|
27 |
printf("<h2>Exécution de la commande :</h2>\n<p class=\"cmd\"><samp>%s</samp></p>\n<pre>", htmlspecialchars($escaped_command)); |
|
28 |
if ($fp = popen($escaped_command, 'r')) { |
|
29 |
while (!feof($fp)) { |
|
30 |
//set_time_limit (20); |
|
31 |
$results = fgets($fp, 4096); |
|
32 |
if (strlen($results) == 0) { |
|
33 |
// stop the browser timing out |
|
34 |
flush(); |
|
35 |
} else { |
|
36 |
$tok = strtok($results, "\n"); |
|
37 |
while ($tok !== false) { |
|
38 |
echo htmlspecialchars(sprintf("%s\n",$tok))."<br/>"; |
|
39 |
flush(); |
|
40 |
$tok = strtok("\n"); |
|
41 |
} |
|
39 | 42 |
} |
40 |
?> |
|
43 |
} |
|
44 |
print("</pre>\n"); |
|
45 |
if (pclose($fp) === 0) { |
|
46 |
print("<h4><span class=\"success\">Opération réussie</span></h4>\n"); |
|
47 |
printf("<p>Pour acceder directement au panorama <a href=\"panorama.php?dir=%s&panorama=%s\">cliquer ici</a></p>\n", |
|
48 |
$panos_dir, $pano_basename); |
|
49 |
} else { |
|
50 |
print("<h4><span class=\"error\">Opération en échec durant l'exécution du script !</span></h4>\n"); |
|
51 |
} |
|
52 |
} else { |
|
53 |
print("<h4><span class=\"error\">Opération en échec à l'ouverture du script !</span></h4>\n"); |
|
54 |
} |
|
55 |
} |
|
56 |
print("<p>Pour acceder à la liste des panoramas <a href=\".\">cliquer ici</a></p>\n") ; |
|
57 |
} |
|
58 |
?> |
getprogress.php | ||
---|---|---|
1 |
<?php |
|
2 |
header('Expires: Tue, 08 Oct 1991 00:00:00 GMT'); |
|
3 |
header('Cache-Control: no-cache, must-revalidate'); |
|
4 |
|
|
5 |
if(isset($_GET['uid'])){ |
|
6 |
$status = apc_fetch('upload_' . $_GET['uid']); |
|
7 |
$url = apc_fetch('link'); |
|
8 |
$message = apc_fetch('info'); |
|
9 |
echo round($status['current']/$status['total']*100)."#".$url."#".$message; |
|
10 |
} |
|
11 |
?> |
images/tetaneutral.svg | ||
---|---|---|
1 |
<?xml version="1.0" encoding="UTF-8" standalone="no"?> |
|
2 |
<!-- Created with Inkscape (http://www.inkscape.org/) --> |
|
3 |
|
|
4 |
<svg |
|
5 |
xmlns:dc="http://purl.org/dc/elements/1.1/" |
|
6 |
xmlns:cc="http://creativecommons.org/ns#" |
|
7 |
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" |
|
8 |
xmlns:svg="http://www.w3.org/2000/svg" |
|
9 |
xmlns="http://www.w3.org/2000/svg" |
|
10 |
version="1.1" |
|
11 |
width="371.90289" |
|
12 |
height="55.950001" |
|
13 |
id="svg2"> |
|
14 |
<metadata |
|
15 |
id="metadata8"> |
|
16 |
<rdf:RDF> |
|
17 |
<cc:Work |
|
18 |
rdf:about=""> |
|
19 |
<dc:format>image/svg+xml</dc:format> |
|
20 |
<dc:type |
|
21 |
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> |
|
22 |
<dc:title></dc:title> |
|
23 |
</cc:Work> |
|
24 |
</rdf:RDF> |
|
25 |
</metadata> |
|
26 |
<defs |
|
27 |
id="defs6" /> |
|
28 |
<rect |
|
29 |
width="371.90289" |
|
30 |
height="55.950001" |
|
31 |
ry="0" |
|
32 |
x="0" |
|
33 |
y="0" |
|
34 |
id="rect2993" |
|
35 |
style="opacity:0.91000001;fill:#fffbf4;fill-opacity:1;stroke:none" /> |
|
36 |
<text |
|
37 |
x="22.015928" |
|
38 |
y="43.308048" |
|
39 |
transform="scale(0.97381679,1.0268872)" |
|
40 |
id="text2987" |
|
41 |
xml:space="preserve" |
|
42 |
style="font-size:43.09389877px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b2a58d;fill-opacity:1;stroke:none;font-family:Sans"><tspan |
|
43 |
x="22.015928" |
|
44 |
y="43.308048" |
|
45 |
id="tspan2989"><tspan |
|
46 |
id="tspan2991" |
|
47 |
style="font-size:43.09389877px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#b2a58d;fill-opacity:1;font-family:Sans;-inkscape-font-specification:Sans Bold">teta</tspan><tspan |
|
48 |
id="tspan3763" |
|
49 |
style="fill:#e8d7bc;fill-opacity:1">neutral</tspan>.net</tspan></text> |
|
50 |
</svg> |
images/valid_css.svg | ||
---|---|---|
1 |
<?xml version="1.0" encoding="iso-8859-1"?> |
|
2 |
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> |
|
3 |
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" version="1.1" overflow="visible" xmlns:xlink="http://www.w3.org/1999/xlink" |
|
4 |
preserveAspectRatio="xMinYMin meet" viewBox="0 0 88 31" width="88" height="31"> |
|
5 |
<g shape-rendering="geometricPrecision" text-rendering="geometricPrecision" image-rendering="optimizeQuality"> |
|
6 |
<g shape-rendering="geometricPrecision" text-rendering="geometricPrecision" image-rendering="optimizeQuality"> |
|
7 |
<g id="Background"> |
|
8 |
</g> |
|
9 |
<g id="Guides"> |
|
10 |
</g> |
|
11 |
<g id="Foreground"> |
|
12 |
<g> |
|
13 |
<polygon points="0,0 88,0 88,31 0,31 0,0 " fill="none"/> |
|
14 |
<path d="M44,15.5" fill="none"/> |
|
15 |
</g> |
|
16 |
<g> |
|
17 |
<polygon points="0,0 83,0 83,31 0,31 0,0 " fill="#B3CEE1"/> |
|
18 |
<path d="M41.5,15.5" fill="#B3CEE1"/> |
|
19 |
</g> |
|
20 |
<g> |
|
21 |
<polygon points="0.365,0 36.809,0 36.809,31 0.365,31 0.365,0 " fill="#FFFFFF"/> |
|
22 |
<path d="M18.587,15.5" fill="#FFFFFF"/> |
|
23 |
</g> |
|
24 |
<g> |
|
25 |
<polygon points="4.692,2.291 44.697,2.291 44.697,26.897 4.692,26.897 4.692,2.291 " fill="none"/> |
|
26 |
<path d="M24.695,14.594" fill="none"/> |
|
27 |
</g> |
|
28 |
<g> |
|
29 |
<g> |
|
30 |
<defs> |
|
31 |
<polygon points="0,30 83,30 83,31 0,31 0,30 " id="XMLID_640_"/> |
|
32 |
</defs> |
|
33 |
<use xlink:href="#XMLID_640_" fill="#504D4C"/> |
|
34 |
<clipPath id="XMLID_666_"> |
|
35 |
<use xlink:href="#XMLID_640_"/> |
|
36 |
</clipPath> |
|
37 |
<g clip-path="url(#XMLID_666_)"> |
|
38 |
<g> |
|
39 |
<polygon points="0,0 88,0 88,31 0,31 0,0 " fill="none"/> |
|
40 |
<path d="M44,15.5" fill="none"/> |
|
41 |
</g> |
|
42 |
<g> |
|
43 |
<polygon points="0,0 83,0 83,31 0,31 0,0 " fill="#48494B"/> |
|
44 |
<path d="M41.5,15.5" fill="#48494B"/> |
|
45 |
</g> |
|
46 |
<g> |
|
47 |
<polygon points="0.365,0 36.809,0 36.809,31 0.365,31 0.365,0 " fill="#4F4F4F"/> |
|
48 |
<path d="M18.587,15.5" fill="#4F4F4F"/> |
|
49 |
</g> |
|
50 |
</g> |
|
51 |
</g> |
|
52 |
</g> |
|
53 |
<g> |
|
54 |
<g> |
|
55 |
<defs> |
|
56 |
<polygon points="82,0 83,0 83,31 82,31 82,0 " id="XMLID_642_"/> |
|
57 |
</defs> |
|
58 |
<use xlink:href="#XMLID_642_" fill="#504D4C"/> |
|
59 |
<clipPath id="XMLID_667_"> |
|
60 |
<use xlink:href="#XMLID_642_"/> |
|
61 |
</clipPath> |
|
62 |
<g clip-path="url(#XMLID_667_)"> |
|
63 |
<g> |
|
64 |
<polygon points="0,0 88,0 88,31 0,31 0,0 " fill="none"/> |
|
65 |
<path d="M44,15.5" fill="none"/> |
|
66 |
</g> |
|
67 |
<g> |
|
68 |
<polygon points="0,0 83,0 83,31 0,31 0,0 " fill="#48494B"/> |
|
69 |
<path d="M41.5,15.5" fill="#48494B"/> |
|
70 |
</g> |
|
71 |
<g> |
|
72 |
<g> |
|
73 |
<defs> |
|
74 |
<polygon points="0,30 83,30 83,31 0,31 0,30 " id="XMLID_644_"/> |
|
75 |
</defs> |
|
76 |
<use xlink:href="#XMLID_644_" fill="#191919"/> |
|
77 |
<clipPath id="XMLID_668_"> |
|
78 |
<use xlink:href="#XMLID_644_"/> |
|
79 |
</clipPath> |
|
80 |
<g clip-path="url(#XMLID_668_)"> |
|
81 |
<g> |
|
82 |
<polygon points="0,0 88,0 88,31 0,31 0,0 " fill="none"/> |
|
83 |
<path d="M44,15.5" fill="none"/> |
|
84 |
</g> |
|
85 |
<g> |
|
86 |
<polygon points="0,0 83,0 83,31 0,31 0,0 " fill="#181818"/> |
|
87 |
<path d="M41.5,15.5" fill="#181818"/> |
|
88 |
</g> |
|
89 |
<g> |
|
90 |
<polygon points="0.365,0 36.809,0 36.809,31 0.365,31 0.365,0 " fill="#191919"/> |
|
91 |
<path d="M18.587,15.5" fill="#191919"/> |
|
92 |
</g> |
|
93 |
</g> |
|
94 |
</g> |
|
95 |
</g> |
|
96 |
</g> |
|
97 |
</g> |
|
98 |
</g> |
|
99 |
<g> |
|
100 |
<polygon points="0,0 1,0 1,31 0,31 0,0 " fill="#CCCCCC"/> |
|
101 |
<path d="M0.5,15.5" fill="#CCCCCC"/> |
|
102 |
</g> |
|
103 |
<g> |
|
104 |
<g> |
|
105 |
<defs> |
|
106 |
<polygon points="2.16,29.005 82.16,29.005 82.16,30.005 2.16,30.005 2.16,29.005 " id="XMLID_646_"/> |
|
107 |
</defs> |
|
108 |
<use xlink:href="#XMLID_646_" fill="#9E9C9C"/> |
|
109 |
<clipPath id="XMLID_669_"> |
|
110 |
<use xlink:href="#XMLID_646_"/> |
|
111 |
</clipPath> |
|
112 |
<g clip-path="url(#XMLID_669_)"> |
|
113 |
<g> |
|
114 |
<polygon points="0,0 88,0 88,31 0,31 0,0 " fill="none"/> |
|
115 |
<path d="M44,15.5" fill="none"/> |
|
116 |
</g> |
|
117 |
<g> |
|
118 |
<polygon points="0,0 83,0 83,31 0,31 0,0 " fill="#9097A0"/> |
|
119 |
<path d="M41.5,15.5" fill="#9097A0"/> |
|
120 |
</g> |
|
121 |
<g> |
|
122 |
<polygon points="0.365,0 36.809,0 36.809,31 0.365,31 0.365,0 " fill="#B5B5B5"/> |
|
123 |
<path d="M18.587,15.5" fill="#B5B5B5"/> |
|
124 |
</g> |
|
125 |
<g> |
|
126 |
<g> |
|
127 |
<defs> |
|
128 |
<polygon points="0,30 83,30 83,31 0,31 0,30 " id="XMLID_648_"/> |
|
129 |
</defs> |
|
130 |
<use xlink:href="#XMLID_648_" fill="#383838"/> |
|
131 |
<clipPath id="XMLID_670_"> |
|
132 |
<use xlink:href="#XMLID_648_"/> |
|
133 |
</clipPath> |
|
134 |
<g clip-path="url(#XMLID_670_)"> |
|
135 |
<g> |
|
136 |
<polygon points="0,0 88,0 88,31 0,31 0,0 " fill="none"/> |
|
137 |
<path d="M44,15.5" fill="none"/> |
|
138 |
</g> |
|
139 |
<g> |
|
140 |
<polygon points="0,0 83,0 83,31 0,31 0,0 " fill="#343536"/> |
|
141 |
<path d="M41.5,15.5" fill="#343536"/> |
|
142 |
</g> |
|
143 |
<g> |
|
144 |
<polygon points="0.365,0 36.809,0 36.809,31 0.365,31 0.365,0 " fill="#383838"/> |
|
145 |
<path d="M18.587,15.5" fill="#383838"/> |
|
146 |
</g> |
|
147 |
</g> |
|
148 |
</g> |
|
149 |
</g> |
|
150 |
<g> |
|
151 |
<g> |
|
152 |
<defs> |
|
153 |
<polygon points="82,0 83,0 83,31 82,31 82,0 " id="XMLID_650_"/> |
|
154 |
</defs> |
|
155 |
<use xlink:href="#XMLID_650_" fill="#383838"/> |
|
156 |
<clipPath id="XMLID_671_"> |
|
157 |
<use xlink:href="#XMLID_650_"/> |
|
158 |
</clipPath> |
|
159 |
<g clip-path="url(#XMLID_671_)"> |
|
160 |
<g> |
|
161 |
<polygon points="0,0 88,0 88,31 0,31 0,0 " fill="none"/> |
|
162 |
<path d="M44,15.5" fill="none"/> |
|
163 |
</g> |
|
164 |
<g> |
|
165 |
<polygon points="0,0 83,0 83,31 0,31 0,0 " fill="#343536"/> |
|
166 |
<path d="M41.5,15.5" fill="#343536"/> |
|
167 |
</g> |
|
168 |
<g> |
Formats disponibles : Unified diff
remise en forme du travail de Victor Pongnian suit à son stage
Il reste pas mal de cosmétique à revoir mais le système devrait déjà être utilisable dans l'état.