472,806 Members | 1,750 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 472,806 software developers and data experts.

Multiple files upload while updating DB

Greetings -

I saw somewhat similar code (pls see link below) that does mupltiple files upload. It works fine, but I wanted to populate the database with the same files that are uploaded to mydirectory, but for some reason, I am getting different file names on the database.


Here is the full code: please do serach on kewword "database" to see where I added my database code - that where I need help with.

And here the link where I got it from:
http://www.bennadel.com/blog/1117-As...ColdFusion.htm

Thank you so much for any input you can provide

@Karim


Expand|Select|Wrap|Line Numbers
  1. <!---
  2. Set the number of files that can uploaded in a single
  3. form submission.
  4. --->
  5. <cfset REQUEST.FileCount = 5 />
  6.  
  7.  
  8. <!--- Set the destination folder for uploads. --->
  9. <cfset REQUEST.UploadPath = ExpandPath( "./uploads/" ) />
  10.  
  11.  
  12. <!--- Param the appropriate number of file fields. --->
  13. <cfloop
  14. index="intFileIndex"
  15. from="1"
  16. to="#REQUEST.FileCount#"
  17. step="1">
  18.  
  19.  
  20. <!--- Param file value. --->
  21. <cfparam
  22. name="FORM.file#intFileIndex#"
  23. type="string"
  24. default=""
  25. />
  26.  
  27.  
  28. </cfloop>
  29.  
  30.  
  31.  
  32.  
  33. <!--- Param upload flag. --->
  34. <cftry>
  35. <cfparam
  36. name="FORM.submitted"
  37. type="numeric"
  38. default="0"
  39. />
  40.  
  41.  
  42. <cfcatch>
  43. <cfset FORM.submitted = 0 />
  44. </cfcatch>
  45. </cftry>
  46.  
  47.  
  48.  
  49.  
  50. <!--- Set up an array to hold errors. --->
  51. <cfset arrErrors = ArrayNew( 1 ) />
  52.  
  53.  
  54.  
  55.  
  56. <!--- Check to see if the form has been submitted. --->
  57. <cfif FORM.submitted>
  58.  
  59.  
  60. <!---
  61. Here is where we would validate the data; however,
  62. in this example, there really isn't anything to
  63. validate. In order to validate something, we are going
  64. to require at least one file to be uploaded!
  65. --->
  66.  
  67.  
  68.  
  69.  
  70. <!---
  71. Since we are going to require at least one file, I am
  72. going to start off with an error statement. Then, I am
  73. gonna let the form tell me to DELETE IT.
  74. --->
  75. <cfset ArrayAppend(
  76. arrErrors,
  77. "Please select at least one file to upload"
  78. ) />
  79.  
  80.  
  81.  
  82.  
  83. <!--- Loop over the files looking for a valid one. --->
  84. <cfloop
  85. index="intFileIndex"
  86. from="1"
  87. to="#REQUEST.FileCount#"
  88. step="1">
  89.  
  90.  
  91. <cfif Len( FORM[ "file#intFileIndex#" ] )>
  92.  
  93.  
  94. <!--- Clear the errors array. --->
  95. <cfset ArrayClear( arrErrors ) />
  96.  
  97.  
  98. <!--- Break out of loop. --->
  99. <cfbreak />
  100.  
  101.  
  102. </cfif>
  103.  
  104.  
  105. </cfloop>
  106.  
  107.  
  108.  
  109.  
  110. <!---
  111. Check to see if there were any form validation
  112. errors. If there are no errors, then we can continue
  113. to process the form. Otherwise, we are going to skip
  114. this and just let the page render again.
  115. --->
  116. <cfif NOT ArrayLen( arrErrors )>
  117.  
  118.  
  119. <!---
  120. Create an array to hold the list of uploaded
  121. files.
  122. --->
  123. <cfset arrUploaded = ArrayNew( 1 ) />
  124.  
  125.  
  126.  
  127.  
  128. <!---
  129. Loop over the form fields and upload the files
  130. that are valid (have a length).
  131. --->
  132. <cfloop
  133. index="intFileIndex"
  134. from="1"
  135. to="#REQUEST.FileCount#"
  136. step="1">
  137.  
  138.  
  139. <!--- Check to see if file has a length. --->
  140. <cfif Len( FORM[ "file#intFileIndex#" ] )>
  141.  
  142.  
  143. <!---
  144. When uploading, remember to use a CFTry /
  145. CFCatch as complications might be encountered.
  146. --->
  147. <cftry>
  148. <cffile
  149. action="upload"
  150. destination="#REQUEST.UploadPath#"
  151. filefield="file#intFileIndex#"
  152. nameconflict="makeunique"
  153. />
  154.  
  155.  
  156. <!---
  157. Store this file name in the uploaded file
  158. array so we can reference it later.
  159. --->
  160. <cfset ArrayAppend(
  161. arrUploaded,
  162. (CFFILE.ServerDirectory & "\" & CFFILE.ServerFile)
  163. ) />
  164.  
  165. <!---  Store file names in the database --->
  166. <CFQUERY NAME="CreateDocumentRecord" DATASOURCE="mydb">
  167.    INSERT INTO Uploads (user_ID, File_Name, Date_Published)
  168.    VALUES (#Form.ClientID#, 'file#intFileIndex#', #Now()#)
  169. </CFQUERY>
  170.  
  171.  
  172.  
  173. <!--- #FILE.ClientFile# #intFileIndex# File_Name, #intFileIndex#--->
  174.  
  175.  
  176. <!--- Catch upload errors. --->
  177. <cfcatch>
  178.  
  179.  
  180. <!--- Store the error. --->
  181. <cfset ArrayAppend(
  182. arrErrors,
  183. "There was a problem uploading file ###intFileIndex#: #CFCATCH.Message#"
  184. ) />
  185.  
  186.  
  187. <!---
  188. Break out of the upload loop as we
  189. don't want to deal with any more
  190. files than we have to.
  191. --->
  192. <cfbreak />
  193.  
  194.  
  195. </cfcatch>
  196. </cftry>
  197.  
  198.  
  199. </cfif>
  200.  
  201.  
  202. </cfloop>
  203.  
  204.  
  205.  
  206.  
  207. <!--- Check to see if we have any form errors. --->
  208. <cfif ArrayLen( arrErrors )>
  209.  
  210.  
  211.  
  212.  
  213. <!---
  214. We encountered an error somewhere in the upload
  215. process. As such, we want to clean up the server
  216. a bit by deleteing any files that were
  217. successfully uploaded as part of this process.
  218. --->
  219. <cfloop
  220. index="intFileIndex"
  221. from="1"
  222. to="#ArrayLen( arrUploaded )#"
  223. step="1">
  224.  
  225.  
  226. <!--- Try to delete this file. --->
  227. <cftry>
  228. <cffile
  229. action="delete"
  230. file="#arrUploaded[ intFileIndex ]#"
  231. />
  232.  
  233.  
  234. <cfcatch>
  235. <!--- File could not be deleted. --->
  236. </cfcatch>
  237. </cftry>
  238.  
  239.  
  240. </cfloop>
  241.  
  242.  
  243.  
  244.  
  245. <cfelse>
  246.  
  247.  
  248.  
  249.  
  250. <!---
  251. !! SUCCESS !!
  252. The files were properly uploaded and processed.
  253. Here is where you might forward someone to some
  254. sort of success / confirmation page.
  255. --->
  256.  
  257.  
  258.  
  259.  
  260. </cfif>
  261.  
  262.  
  263. </cfif>
  264.  
  265.  
  266. </cfif>
  267.  
  268.  
  269.  
  270.  
  271. <!--- Set the content type and reset the output buffer. --->
  272. <cfcontent
  273. type="text/html"
  274. reset="true"
  275. />
  276.  
  277.  
  278. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  279. <html>
  280. <head>
  281. <title>Multiple File Uploads</title>
  282. </head>
  283. <body>
  284.  
  285.  
  286. <cfoutput>
  287.  
  288.  
  289. <h1>
  290. Multiple File Upload ColdFusion Example
  291. </h1>
  292.  
  293.  
  294.  
  295.  
  296. <!--- Check to see if we have any errors to display. --->
  297. <cfif ArrayLen( arrErrors )>
  298.  
  299.  
  300. <p>
  301. Please review the following errors:
  302. </p>
  303.  
  304.  
  305. <ul>
  306. <cfloop
  307. index="intError"
  308. from="1"
  309. to="#ArrayLen( arrErrors )#"
  310. step="1">
  311.  
  312.  
  313. <li>
  314. #arrErrors[ intError ]#
  315. </li>
  316.  
  317.  
  318. </cfloop>
  319. </ul>
  320.  
  321.  
  322. </cfif>
  323.  
  324.  
  325.  
  326.  
  327. <form
  328. action="#CGI.script_name#"
  329. method="post"
  330. enctype="multipart/form-data">
  331.  
  332.  
  333. <!--- Submission flag. --->
  334. <input type="hidden" name="ClientID" value="163">
  335. <input type="hidden" name="submitted" value="1" />
  336.  
  337.  
  338.  
  339.  
  340. <!---
  341. Loop over the number of files we are going to
  342. allow for the upload.
  343. --->
  344. <cfloop
  345. index="intFileIndex"
  346. from="1"
  347. to="#REQUEST.FileCount#"
  348. step="1">
  349.  
  350.  
  351. <label for="file#intFileIndex#">
  352. File #intFileIndex#:
  353. </label>
  354.  
  355.  
  356. <input
  357. type="file"
  358. name="file#intFileIndex#"
  359. id="file#intFileIndex#"
  360. />
  361.  
  362.  
  363. <br />
  364.  
  365.  
  366. </cfloop>
  367.  
  368.  
  369.  
  370.  
  371. <input type="submit" value="Upload Files" />
  372.  
  373.  
  374. </form>
May 21 '09 #1

✓ answered by acoder

Use CFFILE.ServerFile instead of file#intFileIndex# because file#intFileIndex# is the name of the file field in the form, not the uploaded file name.

4 4757
Greetings -

ATTN Bytes Admin: My apologies, I am new to your Forum, I posted this thread on other place by accident, I tried to delete it but I couldn't, please delete the other one when you have a chance. Thank you.

Back to my thread:
I saw this code (pls see link below or code is pasted blow as well) that does mupltiple files upload. It works fine, but I wanted to populate the database with the same files that are uploaded to mydirectory, but for some reason, I am getting different file names on the database.

exp: when I ploaded this files: photo1 photo2 photo3 photo4, I see all of them with right files names photo1.jpg photo2.jpg photo3.jpg photo4.jpg on the upload folder, but they get renamed on the database to: file1 file2 file3 file4. I'd like to see the same file names on the database as well.

Below is the full code: Please do serach on kewword "database" to see where I added my database code - that's where I need help with - everything else is working fine.

And here the link where I got it from:
http://www.bennadel.com/blog/1117-As...ColdFusion.htm

Thank you so much for any input you can provide

@Karim
MoroccoUSA.com


Expand|Select|Wrap|Line Numbers
  1. <!---
  2. Set the number of files that can uploaded in a single
  3. form submission.
  4. --->
  5. <cfset REQUEST.FileCount = 5 />
  6.  
  7.  
  8. <!--- Set the destination folder for uploads. --->
  9. <cfset REQUEST.UploadPath = ExpandPath( "./uploads/" ) />
  10.  
  11.  
  12. <!--- Param the appropriate number of file fields. --->
  13. <cfloop
  14. index="intFileIndex"
  15. from="1"
  16. to="#REQUEST.FileCount#"
  17. step="1">
  18.  
  19.  
  20. <!--- Param file value. --->
  21. <cfparam
  22. name="FORM.file#intFileIndex#"
  23. type="string"
  24. default=""
  25. />
  26.  
  27.  
  28. </cfloop>
  29.  
  30.  
  31.  
  32.  
  33. <!--- Param upload flag. --->
  34. <cftry>
  35. <cfparam
  36. name="FORM.submitted"
  37. type="numeric"
  38. default="0"
  39. />
  40.  
  41.  
  42. <cfcatch>
  43. <cfset FORM.submitted = 0 />
  44. </cfcatch>
  45. </cftry>
  46.  
  47.  
  48.  
  49.  
  50. <!--- Set up an array to hold errors. --->
  51. <cfset arrErrors = ArrayNew( 1 ) />
  52.  
  53.  
  54.  
  55.  
  56. <!--- Check to see if the form has been submitted. --->
  57. <cfif FORM.submitted>
  58.  
  59.  
  60. <!---
  61. Here is where we would validate the data; however,
  62. in this example, there really isn't anything to
  63. validate. In order to validate something, we are going
  64. to require at least one file to be uploaded!
  65. --->
  66.  
  67.  
  68.  
  69.  
  70. <!---
  71. Since we are going to require at least one file, I am
  72. going to start off with an error statement. Then, I am
  73. gonna let the form tell me to DELETE IT.
  74. --->
  75. <cfset ArrayAppend(
  76. arrErrors,
  77. "Please select at least one file to upload"
  78. ) />
  79.  
  80.  
  81.  
  82.  
  83. <!--- Loop over the files looking for a valid one. --->
  84. <cfloop
  85. index="intFileIndex"
  86. from="1"
  87. to="#REQUEST.FileCount#"
  88. step="1">
  89.  
  90.  
  91. <cfif Len( FORM[ "file#intFileIndex#" ] )>
  92.  
  93.  
  94. <!--- Clear the errors array. --->
  95. <cfset ArrayClear( arrErrors ) />
  96.  
  97.  
  98. <!--- Break out of loop. --->
  99. <cfbreak />
  100.  
  101.  
  102. </cfif>
  103.  
  104.  
  105. </cfloop>
  106.  
  107.  
  108.  
  109.  
  110. <!---
  111. Check to see if there were any form validation
  112. errors. If there are no errors, then we can continue
  113. to process the form. Otherwise, we are going to skip
  114. this and just let the page render again.
  115. --->
  116. <cfif NOT ArrayLen( arrErrors )>
  117.  
  118.  
  119. <!---
  120. Create an array to hold the list of uploaded
  121. files.
  122. --->
  123. <cfset arrUploaded = ArrayNew( 1 ) />
  124.  
  125.  
  126.  
  127.  
  128. <!---
  129. Loop over the form fields and upload the files
  130. that are valid (have a length).
  131. --->
  132. <cfloop
  133. index="intFileIndex"
  134. from="1"
  135. to="#REQUEST.FileCount#"
  136. step="1">
  137.  
  138.  
  139. <!--- Check to see if file has a length. --->
  140. <cfif Len( FORM[ "file#intFileIndex#" ] )>
  141.  
  142.  
  143. <!---
  144. When uploading, remember to use a CFTry /
  145. CFCatch as complications might be encountered.
  146. --->
  147. <cftry>
  148. <cffile
  149. action="upload"
  150. destination="#REQUEST.UploadPath#"
  151. filefield="file#intFileIndex#"
  152. nameconflict="makeunique"
  153. />
  154.  
  155.  
  156. <!---
  157. Store this file name in the uploaded file
  158. array so we can reference it later.
  159. --->
  160. <cfset ArrayAppend(
  161. arrUploaded,
  162. (CFFILE.ServerDirectory & "\" & CFFILE.ServerFile)
  163. ) />
  164.  
  165. <!--- Store file names in the database --->
  166. <CFQUERY NAME="CreateDocumentRecord" DATASOURCE="mydb">
  167. INSERT INTO Uploads (user_ID, File_Name, Date_Published)
  168. VALUES (#Form.ClientID#, 'file#intFileIndex#', #Now()#)
  169. </CFQUERY>
  170.  
  171.  
  172.  
  173. <!--- #FILE.ClientFile# #intFileIndex# File_Name, #intFileIndex#--->
  174.  
  175.  
  176. <!--- Catch upload errors. --->
  177. <cfcatch>
  178.  
  179.  
  180. <!--- Store the error. --->
  181. <cfset ArrayAppend(
  182. arrErrors,
  183. "There was a problem uploading file ###intFileIndex#: #CFCATCH.Message#"
  184. ) />
  185.  
  186.  
  187. <!---
  188. Break out of the upload loop as we
  189. don't want to deal with any more
  190. files than we have to.
  191. --->
  192. <cfbreak />
  193.  
  194.  
  195. </cfcatch>
  196. </cftry>
  197.  
  198.  
  199. </cfif>
  200.  
  201.  
  202. </cfloop>
  203.  
  204.  
  205.  
  206.  
  207. <!--- Check to see if we have any form errors. --->
  208. <cfif ArrayLen( arrErrors )>
  209.  
  210.  
  211.  
  212.  
  213. <!---
  214. We encountered an error somewhere in the upload
  215. process. As such, we want to clean up the server
  216. a bit by deleteing any files that were
  217. successfully uploaded as part of this process.
  218. --->
  219. <cfloop
  220. index="intFileIndex"
  221. from="1"
  222. to="#ArrayLen( arrUploaded )#"
  223. step="1">
  224.  
  225.  
  226. <!--- Try to delete this file. --->
  227. <cftry>
  228. <cffile
  229. action="delete"
  230. file="#arrUploaded[ intFileIndex ]#"
  231. />
  232.  
  233.  
  234. <cfcatch>
  235. <!--- File could not be deleted. --->
  236. </cfcatch>
  237. </cftry>
  238.  
  239.  
  240. </cfloop>
  241.  
  242.  
  243.  
  244.  
  245. <cfelse>
  246.  
  247.  
  248.  
  249.  
  250. <!---
  251. !! SUCCESS !!
  252. The files were properly uploaded and processed.
  253. Here is where you might forward someone to some
  254. sort of success / confirmation page.
  255. --->
  256.  
  257.  
  258.  
  259.  
  260. </cfif>
  261.  
  262.  
  263. </cfif>
  264.  
  265.  
  266. </cfif>
  267.  
  268.  
  269.  
  270.  
  271. <!--- Set the content type and reset the output buffer. --->
  272. <cfcontent
  273. type="text/html"
  274. reset="true"
  275. />
  276.  
  277.  
  278. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  279. <html>
  280. <head>
  281. <title>Multiple File Uploads</title>
  282. </head>
  283. <body>
  284.  
  285.  
  286. <cfoutput>
  287.  
  288.  
  289. <h1>
  290. Multiple File Upload ColdFusion Example
  291. </h1>
  292.  
  293.  
  294.  
  295.  
  296. <!--- Check to see if we have any errors to display. --->
  297. <cfif ArrayLen( arrErrors )>
  298.  
  299.  
  300. <p>
  301. Please review the following errors:
  302. </p>
  303.  
  304.  
  305. <ul>
  306. <cfloop
  307. index="intError"
  308. from="1"
  309. to="#ArrayLen( arrErrors )#"
  310. step="1">
  311.  
  312.  
  313. <li>
  314. #arrErrors[ intError ]#
  315. </li>
  316.  
  317.  
  318. </cfloop>
  319. </ul>
  320.  
  321.  
  322. </cfif>
  323.  
  324.  
  325.  
  326.  
  327. <form
  328. action="#CGI.script_name#"
  329. method="post"
  330. enctype="multipart/form-data">
  331.  
  332.  
  333. <!--- Submission flag. --->
  334. <input type="hidden" name="ClientID" value="163">
  335. <input type="hidden" name="submitted" value="1" />
  336.  
  337.  
  338.  
  339.  
  340. <!---
  341. Loop over the number of files we are going to
  342. allow for the upload.
  343. --->
  344. <cfloop
  345. index="intFileIndex"
  346. from="1"
  347. to="#REQUEST.FileCount#"
  348. step="1">
  349.  
  350.  
  351. <label for="file#intFileIndex#">
  352. File #intFileIndex#:
  353. </label>
  354.  
  355.  
  356. <input
  357. type="file"
  358. name="file#intFileIndex#"
  359. id="file#intFileIndex#"
  360. />
  361.  
  362.  
  363. <br />
  364.  
  365.  
  366. </cfloop>
  367.  
  368.  
  369.  
  370.  
  371. <input type="submit" value="Upload Files" />
  372.  
  373.  
  374. </form> 
May 21 '09 #2
acoder
16,027 Expert Mod 8TB
Use CFFILE.ServerFile instead of file#intFileIndex# because file#intFileIndex# is the name of the file field in the form, not the uploaded file name.
May 22 '09 #3
Thank you so much acoder, it worked.

However, I am still struggling to limit the number of files to be uploaded. As you can see, at the begening of the code I pasted, you should see:

Expand|Select|Wrap|Line Numbers
  1. <cfset REQUEST.FileCount = 5 /> 
But this only displays 5 Forms from which a user can select the 5 files to upload. Once these 5 files are uploaded, he/she can keep uploading more files.

Instead, I'd like to see a message stating "you already uploaded 5 files, sorry that was your limit"

I am also working to limit the filesize, let say only 1MB file is allowed.

But, If I can get help on having a user to upload up to 5 files, I would really appreciate that.

Thanks again, you have been very helpful.

@Karim
MoroccoUSA.com
May 22 '09 #4
acoder
16,027 Expert Mod 8TB
Use session variables to keep track of the number of uploads by a user. For file size, use cffile.fileSize.
May 22 '09 #5

Sign in to post your reply or Sign up for a free account.

Similar topics

10
by: 3A Web Hosting | last post by:
Hi Is it possible to perform multiple file uploads via a form? It's no problem uploading single files but I want to be able to highlight a group of files and upload them all in one go. My...
6
by: x. zhang | last post by:
Hi Guys, We know that we can use <input type=file ...> to upload one file per time to the server. My question is if there are some way to upload multiple files per time to the server. (Of...
2
by: Sundar | last post by:
Hi, I am working on ASP.Net. My requirement is that I want to Upload Multiple Files to the Server. I need to have ONLY ONE FILE UPLOAD CONTROL in my page. I SHOULD NOT SUBMIT THE PAGE FOR EACH...
5
by: Jason | last post by:
I have a potential need to upload multiple PDF legal documents. Is it possible to attach more than one file per upload?
7
by: crowl | last post by:
Hi there, I am looking for a component allowing me uploading multiple files by my asp page. I have found several components achieving this by require a <input type="file" name="FileX"> field for...
2
by: shapper | last post by:
Hello, I am creating a simple CMS for a web site. The web site will hold many documents and for that I created Documents table which holds information on each document such as: Title,...
0
by: dann2 | last post by:
hello, i try to upload in an access db two pictures at the same time. i use the adjusted sample code from persits. it looks like this: ... '<% ' Create an instance of AspUpload object 'Set...
7
by: der_grobi | last post by:
That is the Problem: I have an ASP.NET Webapplicatipon where I can upload single files to the Server. That works fine. But now, I want to Upload multiple files. I know the path of the files, i...
43
by: bonneylake | last post by:
Hey Everyone, Well this is my first time asking a question on here so please forgive me if i post my question in the wrong section. What i am trying to do is upload multiple files like gmail...
2
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 2 August 2023 starting at 18:00 UK time (6PM UTC+1) and finishing at about 19:15 (7.15PM) The start time is equivalent to 19:00 (7PM) in Central...
0
by: erikbower65 | last post by:
Using CodiumAI's pr-agent is simple and powerful. Follow these steps: 1. Install CodiumAI CLI: Ensure Node.js is installed, then run 'npm install -g codiumai' in the terminal. 2. Connect to...
0
linyimin
by: linyimin | last post by:
Spring Startup Analyzer generates an interactive Spring application startup report that lets you understand what contributes to the application startup time and helps to optimize it. Support for...
0
by: erikbower65 | last post by:
Here's a concise step-by-step guide for manually installing IntelliJ IDEA: 1. Download: Visit the official JetBrains website and download the IntelliJ IDEA Community or Ultimate edition based on...
14
DJRhino1175
by: DJRhino1175 | last post by:
When I run this code I get an error, its Run-time error# 424 Object required...This is my first attempt at doing something like this. I test the entire code and it worked until I added this - If...
0
by: Rina0 | last post by:
I am looking for a Python code to find the longest common subsequence of two strings. I found this blog post that describes the length of longest common subsequence problem and provides a solution in...
5
by: DJRhino | last post by:
Private Sub CboDrawingID_BeforeUpdate(Cancel As Integer) If = 310029923 Or 310030138 Or 310030152 Or 310030346 Or 310030348 Or _ 310030356 Or 310030359 Or 310030362 Or...
0
by: lllomh | last post by:
How does React native implement an English player?
0
by: Mushico | last post by:
How to calculate date of retirement from date of birth

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.