Brown was drafted by the St. Louis Cardinals in the 18th round of the 2007 Major League Baseball draft.
Brown was called up on June 12, 2011. After hitting .182 in 11 games for St. Louis, he was left off the team's postseason roster and designated for assignment on October 9.
He was claimed off waivers by the Colorado Rockies on October 12.
During the 2012 season, Brown appeared in 46 games for the Rockies, batting .232 with 5 home runs and 11 runs batted in. On the final day of the regular season, Brown was ejected by umpire Mark Ripperger for arguing that he had been hit by a pitch that was instead ruled a foul ball.
On January 2, 2013 he signed a minor league contract with the New York Mets, that contained an invitation to spring training. He started the season in AAA with the Las Vegas 51s and was called up to the majors on May 3, 2013 when Collin Cowgill was optioned to Las Vegas. During Spring Training 2014 he changed his number from 47 to 30.
On opening day, March 31, 2014, Brown started in place of Chris Young and hit a three-run home run in the first inning off of Stephen Strasburg.
Brown was claimed off waivers by the Oakland Athletics on October 31, 2014. The Athletics designated Brown for assignment on November 23, when they acquired Ike Davis. However, the Athletics did not tender him a contract by the December 2 deadline and he became a free agent.
On February 2, 2016, Brown signed a minor league contract with Los Angeles Angels of Anaheim.
On February 29, 2016 he announced his retirement, stating he wished to spend more time with his family.
On January 15, 2015, Brown signed a one-year, $700,000 contract with the SK Wyverns of the KBO League. During his lone season with the SK Wyverns, Brown hit .261 with 28 HRs and 76 RBIs.