progress.cgi
上传用户:wlfwy2004
上传日期:2016-12-12
资源大小:33978k
文件大小:10k
源码类别:

Jsp/Servlet

开发平台:

Java

  1. #!/usr/bin/perl -w
  2. # PHP File Uploader with progress bar Version 1.43
  3. # Copyright (C) Raditha Dissanyake 2003,2004
  4. # http://www.raditha.com
  5. # Licence:
  6. # The contents of this file are subject to the Mozilla Public
  7. # License Version 1.1 (the "License"); you may not use this file
  8. # except in compliance with the License. You may obtain a copy of
  9. # the License at http://www.mozilla.org/MPL/
  10. # Software distributed under the License is distributed on an "AS
  11. # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  12. # implied. See the License for the specific language governing
  13. # rights and limitations under the License.
  14. # The Initial Developer of the Original Code is Raditha Dissanayake.
  15. # Portions created by Raditha are Copyright (C) 2003,2004
  16. # Raditha Dissanayake. All Rights Reserved.
  17. # Portions contributed by Orest Kinasevych are Copyright (C)
  18. # 2003 Kinasevych Saj
  19. #
  20. # CHANGES
  21. # 1.00 
  22. #   No longer uses cookies. This has two major benefits; the first
  23. #   being that minority of users who do not like cookies are not 
  24. #   inconvinienced. Secondly there is one less dependecy and this 
  25. #   would lead to a smoother setup for most people.
  26. #   (if you want to use cookies look at the contrib folder)
  27. #
  28. # 1.02
  29. #   added a cache control header in version 1.02
  30. #
  31. # 1.10
  32. #   Added a more detailed progress bar in version 
  33. #
  34. # 1.42
  35. #   The organization of the temporary files have been improved so to
  36. #   make is easier to clean up after abandoned uploads. (as suggested
  37. #   by Igor Kryltsov)
  38. #
  39. #
  40. use CGI;
  41. use Fcntl qw(:DEFAULT :flock);
  42. #use Carp;
  43. # Carp is only needed if you want debugging. Uncomment the above line
  44. # if you comment out any of the carp statements in the body of the 
  45. # script.
  46. #
  47. # the most obvious issue that we will face is file locking.
  48. # if two threads read and write from the same file at the same
  49. # time only one of them will be allowed to finish the operation.
  50. # Since we are storing our temporary data in a file we are likely to
  51. # run into that exact same problem.
  52. # We can't overcome it but we can make sure the progress bar does
  53. # not display junk when that happens.
  54. #
  55. #
  56. # status codes = 0-uploading, 1-started, 2- complete
  57. $query = new CGI();
  58. $sessionid = $query->param('sessionid');
  59. $sessionid =~ s/[^a-zA-Z0-9]//g;  # santized as suggested by Terrence Johnson.
  60. $iTotal = $query->param('iTotal');
  61. $iRead = $query->param('iRead');
  62. $status =  $query->param('iStatus');
  63. ##
  64. # The code that deals with calculating elapsed time, time remaining 
  65. # and upload speed were contributed by Orest Kinasevych 
  66. ##
  67. ##
  68. # Get values assigned for current time and upload start time
  69. ##
  70. #$dtnow = $query->param('dtnow'); # assign value for current time
  71. $dtnow=time;
  72. $dtstart = $query->param('dtstart'); # assign value for upload start time
  73. ##
  74. #carp "$dtnow  $dtstart";
  75. $thisUrl = $query->url;
  76. ##
  77. # Elapsed time
  78. # Calculate elapsed time and format for display
  79. ##
  80. $dtelapsed = $dtnow - $dtstart;
  81. $dtelapsed_sec = ($dtelapsed % 60); # gets number of seconds
  82. $dtelapsed_min = ((($dtelapsed - $dtelapsed_sec) % 3600) / 60); # gets number of minutes
  83. $dtelapsed_hours = (((($dtelapsed - $dtelapsed_sec) - ($dtelapsed_min * 60)) % 86400) / 3600);
  84. # gets number of hours; assuming that we won't be going into days!
  85. if ($dtelapsed_sec < 10) { $dtelapsed_sec = "0$dtelapsed_sec"; } # append leading zero
  86. if ($dtelapsed_min < 10) { $dtelapsed_min = "0$dtelapsed_min"; } # append leading zero
  87. if ($dtelapsed_hours < 10) { $dtelapsed_hours = "0$dtelapsed_hours"; } # append leading zero
  88. $dtelapsedf = "$dtelapsed_hours:$dtelapsed_min:$dtelapsed_sec"; # display as 00:00:00
  89. ##
  90. ##
  91. # Upload speed
  92. ##
  93. $bSpeed = 0; # if not yet determined
  94. if ($dtelapsed > 0) # avoid divide by zero errors
  95. {
  96. $bSpeed = $iRead / $dtelapsed; # Bytes uploaded / Seconds elapsed = Bytes/Second speed
  97. $bitSpeed = $bSpeed * 8; # bps
  98. $kbitSpeed = $bitSpeed / 1000; # Kbps
  99. }
  100. else
  101. {
  102. $kbitSpeed = $bSpeed; # just pass the zero value
  103. }
  104. $bSpeedf = sprintf("%d",$kbitSpeed); # remove decimals
  105. ##
  106. # Est remaining time
  107. # Calculate remaining time based on upload speed so far
  108. ##
  109. $bRemaining = $iTotal - $iRead; # Total size - amount uploaded = amount remaining
  110. $dtRemaining = 0;
  111. if ($bSpeed > 0) {
  112. # Bytes remaining / Bytes/Second = Seconds 
  113. $dtRemaining = $bRemaining / $bSpeed;
  114. }
  115. $dtRemaining = sprintf("%d",$dtRemaining); # remove decimals
  116. $dtRemaining_sec = ($dtRemaining % 60); # gets number of seconds
  117. $dtRemaining_min = ((($dtRemaining - $dtRemaining_sec) % 3600) / 60); # gets number of minutes
  118. $dtRemaining_hours = (((($dtRemaining - $dtRemaining_sec) - ($dtRemaining_min * 60)) % 86400) / 3600); # gets number of hours; assuming that we won't be going into days!
  119. if ($dtRemaining_sec < 10)
  120. {
  121.   # append leading zero
  122. $dtRemaining_sec = "0$dtRemaining_sec";
  123. }
  124. if ($dtRemaining_min < 10)
  125. {
  126. # append leading zero
  127. $dtRemaining_min = "0$dtRemaining_min";
  128. }
  129. if ($dtRemaining_hours < 10)
  130. {
  131.   # append leading zero
  132. $dtRemaining_hours = "0$dtRemaining_hours";
  133. }
  134. $dtRemainingf = "$dtRemaining_hours:$dtRemaining_min:$dtRemaining_sec"; # display as 00:00:00
  135. ##
  136. # The values for iStatus are
  137. # 0 - in progress
  138. # 1 - New upload
  139. # 2 - Complete
  140. ##
  141. #carp "iTotal = $iTotal, iRead = $iRead, status = $status, sessionId = $sessionid";
  142. require("./header.cgi");
  143. sub readFlength()
  144. {
  145. if(open (STAT, $monitor_file))
  146. {
  147. sysopen(STAT,  $monitor_file, O_RDONLY)
  148. or die "can't open numfile: $!";
  149. $ofh = select(STAT); $| = 1; select ($ofh);
  150. $iTotal = <STAT>;
  151. #carp "trying to read the stuff in $iTotal";
  152. if(defined($iTotal) && $iTotal ne "")
  153. {
  154. return 1;
  155. }
  156. else
  157. {
  158. return 0;
  159. }
  160. return 0;
  161. }
  162. ##
  163. # many thanx to Terrence Johnson who pointed out the fact that i should have added 
  164. # cache control header.
  165. ##
  166. print "Pragma: no-cachen";
  167. print "Content-type: text/xmlnn ";
  168. if($status == 1)
  169. {
  170. #new upload starting
  171. show_starting();
  172. }
  173. elsif($status ==0)
  174. {
  175. ##
  176. # in progress
  177. # we will try to read in the total size of data to be transfered from the
  178. # shared file. It will also tell us how much data has been transfered upto
  179. # now.
  180. ##
  181. $bRead = -s "$post_data_file";
  182. if(defined $bRead)
  183. {
  184. # We have  been able to read in it from the file.
  185. $percent = $bRead * 100 / $iTotal;
  186. $iRead=$bRead;
  187. }
  188. else
  189. {
  190. &show_error();
  191. exit();
  192. }
  193. #
  194. # division results in truncation errors at times so don't compare percentage
  195. # There have been occaisional reports of the progress bar showing 100% but not
  196. # disappearing even after file upload has been completed.
  197. #
  198. # Nils Menrad came up with the solution which is to modify the end of upload
  199. # test.
  200. #
  201. if((($iTotal == $bRead) && $bRead != 0) || $bRead>$iTotal) 
  202. {
  203. if($status == 1 && -e "$signal_file")
  204. {
  205. $bRead=0;
  206. $status=0;
  207. &get_last_values();
  208. }
  209. else
  210. {
  211. show_complete();
  212. unlink $monitor_file;
  213. unlink $post_data_file;
  214. unlink $signal_file;
  215. exit;
  216. }
  217. }
  218. else
  219. {
  220. $kachal = "$bRead , $iTotal";
  221. }
  222. &make_progress_bar();
  223. exit;
  224. }
  225. else 
  226. {
  227. show_complete();
  228. }
  229. #
  230. # Since the progress bar is in html, so it needs to refresh itself periodicaly to
  231. # obtain new values. The refresh url with the query string is generated by this 
  232. # function.
  233. sub make_url
  234. {
  235. #print "Content-type: text/htmlnn ";
  236. #print "hellow $iTotal $iStatus $sessionid $iRead <br>n" ;
  237. ##
  238. $url = "$thisUrl?iTotal=$iTotal&iRead=$iRead&iStatus=$status&sessionid=$sessionid&dtnow=$dtnow&dtstart=$dtstart";
  239. ##
  240. $url =~ s/n//;
  241. return $url;
  242. }
  243. sub make_progress_bar
  244. {
  245. $url = make_url();
  246. print <<__PART1__;
  247. <UploadProgress sessionID="$sessionid">
  248. <RefreshURL><![CDATA[$url]]></RefreshURL>
  249. <TotalBytes>$iTotal</TotalBytes>
  250. <ReadBytes>$iRead</ReadBytes>
  251. <Status>$status</Status>
  252. <Speed>$bSpeedf</Speed>
  253. <TimeRemaining>$dtRemainingf</TimeRemaining>
  254. <TimeElapsed>$dtelapsedf</TimeElapsed>
  255. </UploadProgress>
  256. __PART1__
  257. }
  258. sub show_complete
  259. {
  260. $status=2;
  261. $url = make_url();
  262. print <<__PART2__;
  263. <UploadProgress sessionID="$sessionid">
  264. <RefreshURL><![CDATA[$url]]></RefreshURL>
  265. <TotalBytes>$iTotal</TotalBytes>
  266. <ReadBytes>$iRead</ReadBytes>
  267. <Status>$status</Status>
  268. <Speed>$bSpeedf</Speed>
  269. <TimeRemaining>0</TimeRemaining>
  270. <TimeElapsed>$dtelapsedf</TimeElapsed>
  271. </UploadProgress>
  272. __PART2__
  273. }
  274. sub show_starting
  275. {
  276. #carp "starting";
  277. if(readFlength() == 1)
  278. {
  279. $status=0;
  280. }
  281. $url = make_url();
  282. print <<__PART2__;
  283. <UploadProgress sessionID="$sessionid">
  284. <RefreshURL><![CDATA[$url]]></RefreshURL>
  285. <TotalBytes>$iTotal</TotalBytes>
  286. <ReadBytes>$iRead</ReadBytes>
  287. <Status>$status</Status>
  288. <Speed>$bSpeedf</Speed>
  289. <TimeRemaining>$dtRemainingf</TimeRemaining>
  290. <TimeElapsed>$dtelapsedf</TimeElapsed>
  291. </UploadProgress>
  292. __PART2__
  293. }
  294. sub show_error
  295. {
  296. $url = make_url();
  297. print <<__PART2__;
  298. <UploadProgress sessionID="$sessionid">
  299. <RefreshURL><![CDATA[$url]]></RefreshURL>
  300. <TotalBytes>$iTotal</TotalBytes>
  301. <ReadBytes>$iRead</ReadBytes>
  302. <Status>-1</Status>
  303. <Speed>$bSpeedf</Speed>
  304. <TimeRemaining>$dtRemainingf</TimeRemaining>
  305. <TimeElapsed>$dtelapsedf</TimeElapsed>
  306. </UploadProgress>
  307. __PART2__
  308. }
  309. # this function may not return;
  310. sub get_last_values()
  311. {
  312. if($status == 1)
  313. {
  314. show_starting();
  315. exit;
  316. }
  317. else
  318. {
  319.   if($status == 2)
  320. {
  321. show_complete();
  322. exit;
  323. }
  324. else
  325. {
  326. #
  327. # we have done everything possible to try to retrieve the data
  328. # now try to calculate the percentage once again
  329. #
  330. $iTotal = $iTotal;
  331. $bRead = $iRead;
  332. if(defined($iTotal) && $iTotal != 0)
  333. {
  334. $percent = $bRead * 100 / $iTotal;
  335. $kachal="1";
  336. }
  337. else
  338. {
  339. &show_error();
  340. exit;
  341. }
  342. }
  343. }
  344. }