Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

%3Cpre%20class%3D%22c1%22%3E%0A%3C%2Fpre%3E%0A%3Cdiv%20class%3D%22line%20c2%22%2

ID: 3551852 • Letter: #

Question

%3Cpre%20class%3D%22c1%22%3E%0A%3C%2Fpre%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC1%22%3ECan%20anyone%20please%20help%20to%20convert%0Athis%20program%20from%20Perl%20CGI%20to%20Python%20CGI%3F%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC1%22%3E%3Cbr%20%2F%3E%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC1%22%3E%23!%2Fsoft%2Fperl5.8.7-bin%2Fperl%20-w%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC2%22%3E%3Cbr%20class%3D%22c3%22%20%2F%3E%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC3%22%3Euse%20CGI%20qw(%3Astandard)%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC4%22%3Euse%20CGI%3A%3ACarp%0Aqw(fatalsToBrowser)%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC5%22%3Euse%20File%3A%3APath%20qw(mkpath)%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC6%22%3Euse%20strict%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC7%22%3E%3Cbr%20class%3D%22c3%22%20%2F%3E%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC8%22%3Emy%20%24myCgiObj%20%3D%20new%20CGI%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC9%22%3Emy%20%24kParamStrPhotoIndex%20%3D%20%22pi%22%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC10%22%3Emy%20%24kParamStrPhoto%20%3D%20%22photo%22%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC11%22%3Emy%20%24kParamStrText%20%3D%20%22text%22%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC12%22%3Emy%20%24kParamStrUploadPath%20%3D%0A%22MyPhotos%22%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC13%22%3Emy%20%24kParamStrDbFileName%20%3D%0A%22PhotoHashDb%22%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC14%22%3E%3Cbr%20%2F%3E%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC16%22%3E%23%23%23%20setup%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC17%22%3Emkpath(%24kParamStrUploadPath)%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC18%22%3E%3Cbr%20%2F%3E%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC20%22%3E%23%23%23%20main%20logic%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC21%22%3Emy%20%24aPhotoIndex%20%3D%0A%24myCgiObj-%26gt%3Bparam(%24kParamStrPhotoIndex)%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC22%22%3Emy%20%24aPhotoFile%20%3D%0A%24myCgiObj-%26gt%3Bparam(%24kParamStrPhoto)%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC23%22%3Emy%20%24aPhotoText%20%3D%0A%24myCgiObj-%26gt%3Bparam(%24kParamStrText)%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC24%22%3Eif%20(%24aPhotoFile%20and%20%24aPhotoText)%20%7B%0A%23process%20file%20upload%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC25%22%3E%3Cbr%20class%3D%22c3%22%20%2F%3E%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC26%22%3Eopen(UPLOADFILE%2C%0A%22%26gt%3B%24kParamStrUploadPath%2F%24aPhotoFile%22)%20or%20die%20%22%24!%22%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC27%22%3E%20%26nbsp%3B%26nbsp%3B%26nbsp%3Bwhile%0A(%26lt%3B%24aPhotoFile%26gt%3B)%20%7B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC28%22%3E%0A%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3Bprint%20UPLOADFILE%0A%24_%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC29%22%3E%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%7D%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC30%22%3E%0A%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3Bclose(UPLOADFILE)%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC31%22%3E%3Cbr%20class%3D%22c3%22%20%2F%3E%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC32%22%3E%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3Bmy%0A%25myTextDbHash%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC33%22%3E%0A%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3Bdbmopen(%25myTextDbHash%2C%0A%24kParamStrDbFileName%2C%200755)%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC34%22%3E%0A%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%24myTextDbHash%7B%24aPhotoFile%7D%20%3D%0A%24aPhotoText%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC35%22%3E%0A%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3Bclose(%25myTextDbHash)%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC36%22%3E%3Cbr%20class%3D%22c3%22%20%2F%3E%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC37%22%3E%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3Bprint%0A%22Status%3A%20302%20Moved%5CnLocation%3A%20%22%20.%20url(-relative%3D%26gt%3B1)%20.%0A%22%5Cn%5Cn%22%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC38%22%3E%7D%20elsif%20(defined(%24aPhotoIndex)%20and%0A(%24aPhotoIndex%20ne%20%22%22))%20%7B%20%23delete%20a%20certain%20photo%20at%20given%0Aindex%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC39%22%3E%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3Bmy%0A%25myTextDbHash%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC40%22%3E%0A%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3Bdbmopen(%25myTextDbHash%2C%0A%24kParamStrDbFileName%2C%200755)%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC41%22%3E%3Cbr%20class%3D%22c3%22%20%2F%3E%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC42%22%3E%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3Bmy%0A%24aIndexCount%20%3D%200%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC43%22%3E%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3Bforeach%20my%0A%24aPhotoFileName%20(keys%20%25myTextDbHash)%20%7B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC44%22%3E%0A%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3Bif%20(%24aPhotoIndex%20%3D%3D%0A%24aIndexCount)%20%7B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC45%22%3E%0A%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3Bunlink(%22%24kParamStrUploadPath%2F%24aPhotoFileName%22)%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC46%22%3E%0A%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3Bdelete%0A%24myTextDbHash%7B%24aPhotoFileName%7D%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC47%22%3E%0A%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3Blast%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC48%22%3E%0A%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%7D%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC49%22%3E%0A%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%24aIndexCount%2B%2B%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC50%22%3E%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%7D%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC51%22%3E%3Cbr%20class%3D%22c3%22%20%2F%3E%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC52%22%3E%0A%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3Bclose(%25myTextDbHash)%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC53%22%3E%3Cbr%20class%3D%22c3%22%20%2F%3E%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC54%22%3E%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3Bprint%0A%22Status%3A%20302%20Moved%5CnLocation%3A%20%22%20.%20url(-relative%3D%26gt%3B1)%20.%0A%22%5Cn%5Cn%22%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC55%22%3E%7D%20else%20%7B%20%23output%20main%20view%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC56%22%3E%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3Bprint%0A%22Content-type%3A%20text%2Fhtml%5Cn%5Cn%22%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC57%22%3E%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3Bprint%0Aqq(%26lt%3B!DOCTYPE%20html%26gt%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC58%22%3E%0A%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26lt%3Bhtml%26gt%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC59%22%3E%0A%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26lt%3Bhead%26gt%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC60%22%3E%0A%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26lt%3Btitle%26gt%3BSimple%0ASlide-Show%26lt%3B%2Ftitle%26gt%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC61%22%3E%0A%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26lt%3Blink%0Arel%3D%22shortcut%20icon%22%20id%3D%22favicon%22%20type%3D%22image%2Fx-icon%22%0Ahref%3D%22favicon.ico%22%20%2F%26gt%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC62%22%3E%0A%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26lt%3Bmeta%0Aname%3D%22author%22%20content%3D%22Jason%20Zerbe%22%20%2F%26gt%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC63%22%3E%0A%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26lt%3Bmeta%0Aname%3D%22robots%22%20content%3D%22noindex%2Cnofollow%22%20%2F%26gt%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC64%22%3E%0A%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26lt%3Bmeta%0Aname%3D%22description%22%20content%3D%22simple%20Perl%20and%20JavaScript%20photo%0Agallery%22%20%2F%26gt%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC65%22%3E%0A%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26lt%3Blink%0Arel%3D%22stylesheet%22%20href%3D%22style.css%22%20%2F%26gt%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC66%22%3E%0A%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26lt%3Bscript%0Atype%3D%22text%2Fjavascript%22%20src%3D%22script.js%22%26gt%3B%26lt%3B%2Fscript%26gt%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC67%22%3E%0A%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26lt%3B%2Fhead%26gt%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC68%22%3E%0A%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26lt%3Bbody%26gt%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC69%22%3E%0A%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B)%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC70%22%3E%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3Bprint%0A'%26lt%3Bform%20id%3D%22formUpload%22%20method%3D%22post%22%0Aaction%3D%22'.url(-relative%3D%26gt%3B1)%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC71%22%3E%0A%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B.'%22%0Aenctype%3D%22multipart%2Fform-data%22%0Aonsubmit%3D%22validateFileType(%26amp%3Bquot%3BformUploadInputFile%26amp%3Bquot%3B)%3B%22%26gt%3B'.%22%5Cn%22%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC72%22%3E%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3Bprint%0Aqq(%26lt%3Bstrong%26gt%3BAdd%20Photo%26lt%3B%2Fstrong%26gt%3B%20%26lt%3Bbutton%0Aonclick%3D%22displayNoneByEleId('formUpload')%3B%22%26gt%3BClose%26lt%3B%2Fbutton%26gt%3B%26lt%3Bbr%0A%2F%26gt%3B%26lt%3Bbr%20%2F%26gt%3B)%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC73%22%3E%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3Bprint%0A'%26lt%3Binput%20id%3D%22formUploadInputFile%22%20type%3D%22file%22%0Aname%3D%22'.%24kParamStrPhoto%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC74%22%3E%0A%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B.'%22%0Aonblur%3D%22validateFileType(%26amp%3Bquot%3BformUploadInputFile%26amp%3Bquot%3B)%3B%22%0A%2F%26gt%3B%26lt%3Bbr%20%2F%26gt%3B'.%22%5Cn%22%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC75%22%3E%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3Bprint%0A'%26lt%3Binput%20type%3D%22text%22%20name%3D%22'.%24kParamStrText.'%22%20%2F%26gt%3B'%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC76%22%3E%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3Bprint%0Aqq(%26lt%3Binput%20type%3D%22submit%22%20value%3D%22Add%22%20%2F%26gt%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC77%22%3E%0A%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26lt%3B%2Fform%26gt%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC78%22%3E%0A%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26lt%3Bbutton%0Aonclick%3D%22displayBlockByEleId('formUpload')%3B%22%26gt%3BAdd%0APhoto%26lt%3B%2Fbutton%26gt%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC79%22%3E%0A%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26lt%3Bbutton%0Aonclick%3D%22showStart('displayWindow')%3B%22%26gt%3BStart%0AShow%26lt%3B%2Fbutton%26gt%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC80%22%3E%0A%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26lt%3Bbutton%0Aonclick%3D%22showStop('displayWindow')%3B%22%26gt%3BStop%0AShow%26lt%3B%2Fbutton%26gt%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC81%22%3E%3Cbr%20class%3D%22c3%22%20%2F%3E%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC82%22%3E%0A%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26lt%3Bdiv%0Aid%3D%22divThumbTiles%22%26gt%3B)%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC83%22%3E%3Cbr%20class%3D%22c3%22%20%2F%3E%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC84%22%3E%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%23get%20image%0Alist%20and%20text%20from%20database%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC85%22%3E%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3Bmy%0A%25myTextDbHash%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC86%22%3E%0A%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3Bdbmopen(%25myTextDbHash%2C%0A%24kParamStrDbFileName%2C%200755)%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC87%22%3E%0A%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3Bclose(%25myTextDbHash)%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC88%22%3E%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%23output%0Athumbnail%20tiles%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC89%22%3E%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3Bmy%0A%24aOutputCount%20%3D%200%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC90%22%3E%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3Bforeach%20my%0A%24aPhotoFileName%20(keys%20%25myTextDbHash)%20%7B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC91%22%3E%0A%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3Bprint%20'%26lt%3Bimg%0Aid%3D%22aThumbImg'.%24aOutputCount.'%22%0Aonclick%3D%22loadIndexToEleId('.%24aOutputCount%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC92%22%3E%0A%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B.'%2C%0A%26amp%3Bquot%3BdisplayWindow%26amp%3Bquot%3B)%3B%22%0Asrc%3D%22'.%24kParamStrUploadPath.'%2F'.%24aPhotoFileName%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC93%22%3E%0A%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B.'%22%0Atitle%3D%22'.%24myTextDbHash%7B%24aPhotoFileName%7D.'%22%20%2F%26gt%3B'%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC94%22%3E%0A%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%24aOutputCount%2B%2B%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC95%22%3E%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%7D%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC96%22%3E%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3Bprint%0A'%26lt%3B%2Fdiv%26gt%3B'%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC97%22%3E%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3Bprint%0A'%26lt%3Bdiv%20id%3D%22aTotalImageCount%22%20style%3D%22display%3A%0Anone%3B%22%26gt%3B'.%24aOutputCount.'%26lt%3B%2Fdiv%26gt%3B'%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC98%22%3E%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3Bmy%0A%24aBaseDeletePathStr%20%3D%20url(-relative%3D%26gt%3B1)%20.%0A%22%3F%24kParamStrPhotoIndex%3D%22%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC99%22%3E%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3Bprint%0Aqq(%26lt%3Bdiv%20id%3D%22displayWindow%22%26gt%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC100%22%3E%0A%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26lt%3Bbutton%0Aid%3D%22buttonNext%22%0Aonclick%3D%22nextIndex('displayWindow')%3B%22%26gt%3BNext%26lt%3B%2Fbutton%26gt%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC101%22%3E%0A%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26lt%3Bbutton%0Aid%3D%22buttonPrev%22%0Aonclick%3D%22prevIndex('displayWindow')%3B%22%26gt%3BPrevious%26lt%3B%2Fbutton%26gt%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC102%22%3E%0A%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26lt%3Bbutton%0Aid%3D%22buttonClose%22%0Aonclick%3D%22displayNoneByEleId('displayWindow')%3B%22%26gt%3BClose%26lt%3B%2Fbutton%26gt%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC103%22%3E%0A%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26lt%3Bbutton%0Aid%3D%22buttonDelete%22%0Aonclick%3D%22deleteCurrentImage('%24aBaseDeletePathStr')%3B%22%26gt%3BDelete%26lt%3B%2Fbutton%26gt%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC104%22%3E%0A%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26lt%3Bdiv%0Aclass%3D%22clear%22%26gt%3B%26amp%3Bnbsp%3B%26lt%3B%2Fdiv%26gt%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC105%22%3E%0A%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26lt%3Bdiv%0Aid%3D%22displayWindowImg%22%26gt%3B%26amp%3Bnbsp%3B%26lt%3B%2Fdiv%26gt%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC106%22%3E%0A%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26lt%3Bdiv%0Aid%3D%22displayWindowInfo%22%26gt%3B%26amp%3Bnbsp%3B%26lt%3B%2Fdiv%26gt%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC107%22%3E%0A%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26lt%3Bdiv%0Aclass%3D%22clear%22%26gt%3B%26amp%3Bnbsp%3B%26lt%3B%2Fdiv%26gt%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC108%22%3E%0A%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26lt%3B%2Fdiv%26gt%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC109%22%3E%0A%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26lt%3B%2Fbody%26gt%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC110%22%3E%0A%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26lt%3B%2Fhtml%26gt%3B)%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC111%22%3E%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3Bprint%0A%22%5Cn%22%3B%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22line%20c2%22%20id%3D%22LC112%22%3E%7D%3C%2Fdiv%3E%0A

Explanation / Answer

use CGI qw(:standard); use Cwd; use File::Basename;
my $currentDirectory = getcwd; $newDirectory = $currentDirectory . '/MyPhotos'; $descriptionFile = $newDirectory . '/descriptions.txt';
#Create MyPhotos directory if not already created unless(-e $newDirectory or mkdir($newDirectory, 0701)) { die "Unable to create photo directory '$newDirectory' "; }
$q = new CGI;
#The following code is run when the "Delete" button has been pressed. if ($q->param('Delete') eq "Delete"){
#Construct a list of images that have had their checkbox checked. @tobedeleted; @paramlist = $q->param(); foreach $param (@paramlist){ if($param =~/^checkbox/){ if($q->param($param) eq "yes"){ $param =~ s/checkbox//g; push(@tobedeleted, $param); } } }
#Loop through the hash and delete images listed in @tobedeleted. $count = 1; dbmopen(%descriptionHash, "./MyPhotos/descriptions", 0604); @files = <$newDirectory/*>; foreach $file (@files){ $filename = basename($file); if (!($filename eq 'descriptions.pag') and !($filename eq 'descriptions.dir')){ foreach $index (@tobedeleted){ if($count eq $index){ #delete file unlink($file); #remove entry from hash delete $descriptionHash{$filename}; } } $count = $count + 1; } } close(%descriptionHash);
}
#Remove any query parameters $q->delete_all();
print $q->header; print $q->start_html(-title=>'Assignment 3',-style=>{-src=>'styles/style.css'}, -script=>{-type=>'text/javascript', -src=>'javascript/javascript.js'});
#Store HTML code (mostly from assignment 2) in variables
$HTML1 = <<MYEOF; <div id="pageContainer"> <div id="upperContainer"> <div id="upperButtons"> <button id="b_start" type="button" class="upperButton" >Start</button> <button id="b_next" type="button" class="upperButton" >Next</button> <button id="b_previous" type="button" class="upperButton">Previous</button> <button id="b_upload" type="button" class="upperButton" >Upload</button> <button id="b_refresh" type="button" class="upperButton" > Refresh View</button> MYEOF
$HTML2 = <<MYEOF; </div> <br /> <div id="instructions"> - Click a thumbnail to enlarge it.<br /> - Indicate images you want to remove via the corresponding checkbox.<br /> - Press 'Delete' to delete checked images.<br /> - You must press 'Refresh View' after uploading an image to display it.<br /> </div> <br /> <div id="thumbnails"> MYEOF
$HTML3 = <<MYEOF; </div> <hr /> <div id="lowerContainer"> <div id="lowerButtons"> <button id="b_startSlideShow" type="button" class="lowerButton" >Start Slide Show</button> <button id="b_stopSlideShow" type="button" class="lowerButton">Stop Slide Show</button> </div> <div id="lowerContentContainer"> <div id="lowerImage"> <img id="image_enlarged" src="" alt="" height="300px" width="500px" /> </div> <div id="lowerImageInfo"> <p>Description:</p> </div> </div> </div> </div>
MYEOF
#Start the form, add first HTML section, add submit button, add second HTML section print $q->start_multipart_form( -name => 'slideshowform', -onSubmit => 'deleteImages()'); print $HTML1; print $q->submit("Delete"); print $HTML2;
## Add img tag for each image uploaded so far @files = <$newDirectory/*>; $count = '0'; foreach $file (@files){ $filename = basename($file); if (!($filename eq 'descriptions.pag') and !($filename eq 'descriptions.dir')){ $count = $count + 1; print img({src=>'MyPhotos/'.$filename, height=>'50', width=>'50', id=>'thumb'.$count, class=>'image_thumb', print '<input type="checkbox" class="checkboxes" id="checkbox' . $count . '" name="checkbox' . $count .'" value="yes" />'; } }
print '</div><div id="descriptions">';

#read in hash from file dbmopen(%descriptionHash, "./MyPhotos/descriptions", 0604);
#create a hidden field for each image's description, to be accessed by javascript for displaying image description @files = <$newDirectory/*>; $count = 0; foreach $file (@files){ $filename = basename($file); if (!($filename eq 'descriptions.pag') and !($filename eq 'descriptions.dir')){ $count = $count + 1; $descriptionString = $descriptionHash{$filename}; print '<input type=hidden id="'.$count.'" value="'.$descriptionString.'" />'; } } close(%descriptionHash);
#finish adding the rest of the html to the page print '</div>'; print $q->end_form(); print $HTML3;
print $q->end_html;