Короче говоря, проанализировав твой(Павлова) код и симптомы Апач, я пришел к выводу, что баг в этих местах:
...
foreach(@parts){ 
($header,$body)=split(/\\n\\s*\\n/,$_,2); 
($name)=(/name=\\"([^\\"]*)\\"/);  - - - - - лажа
$body=~s/\\n$//; 
$body=~s/\\r$//; 
($filename)=(/filename\\"([^\\"]*)\\"/); - - - - - лажа
...
попробуй ($name) = ($header =~ /name=\\"?([^"\\]*\\"/);
($filename) = ($header =~ /filename=\\"?([^"\\]*\\"/) соответственно.
Может я и ошибаюсь, но в любом случае используй хотя бы -w.
А вот в конструкции
...
while(-e "$fotodir/$userfilename1"){ 
$userfilename1="$filedup_$userfilename"; - - - полная лажа
$filedup++; 
} 
...
правильно будет $userfilename1="$filedup\\_$userfilename"; 
тут ошибка на 100%, потому как "$filedup_$userfilename" интерпретируеться как "$filedup_"+"$userfilename". Первое у нас - андеф, соответственно мы получаем замкнутый цыкл - потому Апач и виснет.
На первый взгляд болше топорных ошыбок я не встретил.
Удачи!