As far as how this fits into the portfolio API itself, this is no problem. Implementation would involve:
class portfolio_course_studentwork extends portfolio_caller_base
implement the methods necessary to poll all modules and ask them to return content in HTML and file ids,
and send that to the portfolio API to write to a temporary location
Box.net would send all the files individually (there could be an exportconfig option to zip them though).
Mahara doesn't make that much sense for this using HTML and files, although it technically works. However I think LEAP would be a better way to go
File download will zip all the files together.