protected void Page_Load(object sender, EventArgs e) { var result = new AjaxResponse(); try { // assume success unless an exception is thrown result.Success = true; // copy back the groupname and uploadid result.GroupName = Request.Form["groupname"]; result.UploadId = Request.Form["uploadid"]; // there should always be exactly one file if (Request.Files.Count == 0) { throw new VoteException("The upload file is missing"); } if (Request.Files.Count > 1) { throw new VoteException("Unexpected files in the upload package"); } // Test error handling //throw new VoteException("Some weird-ass error"); // get the file var postedFile = Request.Files[0]; var filename = postedFile.FileName; var saveAs = Request.Form["saveas"]; if (!string.IsNullOrWhiteSpace(saveAs)) { filename = saveAs; } if (!filename.EndsWith(".csv", StringComparison.OrdinalIgnoreCase)) { filename += ".csv"; } var duplicate = BallotPediaCsvs.FilenameExists(filename); if (duplicate && (Request.Form["overwrite"] != "true")) { throw new VoteException( "A CSV with this filename has already been uploaded. Either rename the file or check the 'overwrite existing file' box."); } // save the timestamp so the time we post to all the various tables matches // exactly... var uploadTime = DateTime.UtcNow; string csv; var coded = 0; var candidateCount = 0; using ( var csvReader = new CsvReader( new StreamReader(postedFile.InputStream, Encoding.UTF8), true)) { var headers = csvReader.GetFieldHeaders(); var normalizedHeaders = NormalizeHeaders(headers); var columnsToAdd = new List <string>(); if (!headers.Contains("VoteUSA Id")) { columnsToAdd.Add("VoteUSA Id"); } if (!headers.Contains("VoteUSA Url")) { columnsToAdd.Add("VoteUSA Url"); } using (var ms = new MemoryStream()) { var streamWriter = new StreamWriter(ms); var csvWriter = new SimpleCsvWriter(); // write headers foreach (var col in normalizedHeaders) { csvWriter.AddField(col); } foreach (var col in columnsToAdd) { csvWriter.AddField(col); } csvWriter.Write(streamWriter); while (csvReader.ReadNextRecord()) { foreach (var col in headers) { var value = csvReader[col]; csvWriter.AddField(value); if ((col == "VoteUSA Id") && !string.IsNullOrWhiteSpace(value)) { coded++; } } // ReSharper disable once UnusedVariable foreach (var col in columnsToAdd) { csvWriter.AddField(string.Empty); } csvWriter.Write(streamWriter); candidateCount++; } streamWriter.Flush(); ms.Position = 0; csv = new StreamReader(ms).ReadToEnd(); } } if (duplicate) { BallotPediaCsvs.DeleteByFilename(filename); } BallotPediaCsvs.Insert(filename, uploadTime, csv, candidateCount, coded, false); result.Message = "The CSV uploaded successfully."; } catch (Exception ex) { result.Success = false; result.Message = ex.Message; } WriteJsonResultToResponse(result); }