У меня есть страница, на которой пользователь может загрузить свой собственный CSV или ввести значения в список, который затем создает csv (в фоновом режиме). Независимо от того, каким образом создается csv, мне нужно загрузить этот csv на наш сервер через поток байтов.запись и чтение из байтового потока
Моя проблема заключается в том, что когда я создаю csv, мне не нужно создавать временный файл, я должен иметь возможность писать в поток, а затем читать его для загрузки. Как удалить необходимость в временном файле?
текущий код, который работает (но использует временный файл):
try {
string filename = DateTime.Now.ToString("MMddyyHmssf");
filename = filename + ".csv";
string directory = ConfigurationManager.AppSettings["TempDirectory"].ToString();
path = Path.Combine(directory, filename);
using (StreamWriter sw = File.CreateText(path)) {
foreach (ListItem item in this.lstAddEmailAddress.Items) {
sw.WriteLine(" , ," + item.ToString());
}
}
} catch (Exception ex) {
string error = "Cannot create temp csv file used for importing users by email address. Filepath: " + path + ". FileException: " + ex.ToString();
this.writeToLogs(error, 1338);
}
}
// put here for testing the byte array being sent vs ready byte[] byteArray = System.IO.File.ReadAllBytes(path);
myCsvFileStream = File.OpenRead(path);
nFileLen = (int)myCsvFileStream.Length;
Я попытался
Stream myCsvFileStream;
using (StreamWriter sw = new StreamWriter(myCsvFileStream)) {
foreach (ListItem item in this.lstAddEmailAddress.Items) {
sw.WriteLine(" , ," + item.ToString());
}
}
Однако поскольку myCsvFileStream не инициализируется (потому что поток является статическим классом) всегда нуль ,
Вот что я делаю с данными (поток байтов) после создания csv.
byte[] file = new byte[nFileLen];
myCsvFileStream.Read(file, 0, nFileLen);
bool response = this.repositoryService.SaveUsers(this.SelectedAccount.Id, file, this.authenticatedUser.SessionToken.SessionId);
myCsvFileStream.Close();
В конце концов я использовал StringBuilder
создать мое содержимое файла CSV. Затем он получил байтовый массив своего содержимого и использовал это для заполнения моего общего потока (я говорю, что общий, поскольку, когда пользователь вводит свой собственный CSV-файл, он является HttpPostedFile
, но при отправке его на наш сервер с помощью остального вызова (respositoryservices.saveusers
) он использует тот же поток байт, что бы с помощью этого метода)
StringBuilder csvFileString = new StringBuilder();
sharedStreamForBatchImport = new MemoryStream();
foreach (ListItem item in this.lstAddEmailAddress.Items) {
csvFileString.Append(",," + item.ToString() + "\\r\\n");
}
//get byte array of the string
byteArrayToBeSent = Encoding.ASCII.GetBytes(csvFileString.ToString());
//set length for read
byteArraySize = (int)csvFileString.Length;
//read bytes into the sharedStreamForBatchImport (byte array)
sharedStreamForBatchImport.Read(byteArrayToBeSent, 0, byteArraySize);
Возможно, мне не нужен звонок для чтения. я должен иметь возможность просто установить возврат из getbytes в sharedstreamforbatchimport. но это на другой день –