If you write the filename to the page:
<?php echo($Product->getColumnVal("filename")); ?>
What is the value?
It must not be: "filename.zip"
Because that is the filename that works. I don't think the issue depends on if it is dynamic or not. It shouldn't matter as long as the correct file name is passed.