Born in Westminster, London, Harris once held the record for the youngest player ever to appear for Wycombe in the Football League, breaking Ikechi Anya's record set in 2004 by coming on as a substitute for the final 12 minutes against Yeovil Town in December 2009, aged 16 years and 201 days. Harris' record was broken by Jordan Ibe in October 2011.
Harris made his home debut for the club against Gillingham on the last day of the 2009–10 season. He found his chances for first team football limited in the 2010–11 season, only featuring for 25 minutes in the Football League Trophy tie with Bristol Rovers. He scored his first goal for the first team in the quarter-final of the Berks & Bucks Senior Cup against Burnham. Harris was awarded the League Two Apprentice of the Year at the Football League Awards in April 2011 and later that month was one of four Wycombe scholars to be awarded professional contracts by the club. Harris was subject to a £50,000 bid by Premier League side Fulham in July 2011 but the offer was rejected by Wycombe. Harris made a late cameo appearance on the first day of the 2011–12 season against Scunthorpe United, replacing Joel Grant. He then made his first start in a competitive match for Wycombe in the League Cup during Wycombe's clash with Colchester United on 9 August 2011. Wycombe won on penalties but the game also saw Harris' record as youngest player broken by Jordan Ibe. On 24 September 2011, Harris made his first league start for club in a 1–0 win over Sheffield United. He was a first team regular and 22 appearances during the first half of the 2011/12 season, before departing the club in January 2012. Harris made 26 appearances in all competitions for Wycombe and scored no goals.
On 30 January 2012, Harris signed for Championship side Cardiff City on a three-and-half-year contract for an undisclosed fee. His maiden call up to the first team came in a 3–1 league defeat to Blackpool on 4 February 2012, when he was an unused substitute. He was an unused substitute on a further three occasions during the 2011/12 season and was not called into the squad for the playoffs or the 2012 League Cup final. Harris was only called into the first team squad on one occasion during the 2012/13 Championship-winning season, when he made his debut in a 2–1 FA Cup third round defeat against Macclesfield Town on 5 January 2013. Harris started the match and was substituted for Tommy O'Sullivan after 64 minutes. Harris received his first call into the first team squad of the 2013/14 season on 28 August 2013, when he was an unused substitute for a 2–0 League Cup first round win over Accrington Stanley. He was again an unused substitute in the following round, which saw Cardiff lose 3–2 to fellow Premier League side West Ham United.
After putting in an "outstanding" performance for Cardiff in a Professional Development League game versus Brentford, on 18 October 2013 Harris joined the League One side on a loan running until 5 January 2014. The following day, he was included in the squad to face Colchester United and after replacing Will Grigg on 65 minutes, he scored the first senior goal of his career in a 3–1 win. Harris scored his second Brentford goal in an FA Cup first round tie against local neighbours Staines Town on 9 November, scoring the second in a 5–0 victory. Harris was stretchered off with a hamstring problem in a 3–0 victory over Preston North End on 21 December, casting doubt on his loan being extended. On 26 December it was reported that Harris would be out for a month, with manager Mark Warburton keen on extending the loan. Harris tweeted on 29 December that he would be returning to Cardiff, leaving plans to extend his loan up in the air. Harris made 11 appearances for Brentford and scored two goals. It was reported in mid-March 2014 that Harris was close to a return to the Bees to cover for the injured Sam Saunders, despite being sidelined with an ankle injury himself.
The following season, Harris started to become a regular under new manager, Russell Slade, who was appointed in October. He played his first league game for Cardiff in a 5–3 loss to Bournemouth, on 20 December. Harris scored his first goal for The Bluebirds in a FA Cup win against Colchester United, following this with his first league goal against Norwich City.
On 22 August 2015, Harris joined League One side Barnsley on loan until 21 November 2015. He made his debut in a goalless draw against Bradford City and went onto make 14 appearances for Barnsley before returning to Cardiff.
Harris received a lot of praise from Cardiff fans and manager, Paul Trollope, after his performances against Blackburn Rovers and Fulham in an unusual right wing back position. Harris continued to impress under new manager, Neil Warnock and eventually found his first goal on 14 January, scoring in the Severnside derby against Bristol City in a 3–2 win. He followed this by scoring two to help Cardiff come back from 2 goals down to beat Derby County, 4–3, before scoring his third in two games against Rotherham United.
His performance throughout the season saw Harris gifted the number 11 shirt for the 2017–18 season. However, an ankle injury suffered during pre-season ruled him out for 3 months.As of match played 29 April 2017.
Football League Two Apprentice of the Year: 2010