I have a data set with zipcodes and would like to do a bulk upload to a tool that will give me the cities each zip is in (US only.)
There is no simple answer to this question, because ZIP codes do not represent geographical areas. They represent postal delivery routes, which are sometimes simply a bank of PO boxes in a specific post office, and are sometimes an organization like a University which has its own internal mail processing services.
Therefore, not all ZIP Codes can truly be located in a city, and even those for which a geography can be reasonably defined, they are not necessarily located within a single city.
Probably the closest approximation you could get would be to start with the Census Bureau's ZIP code tabulation area (ZCTA) gazetteer file, which can be downloaded here. Then, using as many of the state-based "place" shape files as you need, load those into a GIS tool. Personally, I'd use PostGIS, but you might also be able to use QGIS, or if you can get your hands on a copy, ArcGIS (commercial software).
You could then:
You will probably have some ZIP codes which aren't in the ZCTA dataset, and it's not really precise, but it's probably good enough for a lot of cases.
There has been some mention about this being a complex problem. It's not hard at all. In fact, matching a zipcode to the corresponding cities is super simple. Granted, trying to find an accurate shapefile that corresponds to a given zipcode, that is a more challenging issue. But simply matching zipcode to city/cities... very easy The USPS data has a Preferred city for each zipcode and then a list of acceptable city names as well as a list of unacceptable city names. This list is readily available and updated monthly from the US Postal Service. So, even someone with Excel skills (including JOIN or HLOOKUP) could do the matching on a list of zipcodes.
[I work at SmartyStreets, that's why I have inside information about it and can offer our services.]