Выполняя базовую проверку коллекции ASP.Net (4.0) Request.Files
(загрузка), я решил попробовать ее с LINQ.
Коллекция IEnumerable<T>
и поэтому не предлагает ForEach. По глупости я решил создать метод расширения, который бы справился с этой задачей. Извините, что не очень удачно ...
При запуске метода расширения (см. Ниже) возникает следующая ошибка:
Невозможно привести объект типа System.String к типу System.Web.HttpPostedFile
Я явно чего-то не понимаю, но я не могу понять, что это такое, поэтому, рискуя выглядеть идиотом (не в первый раз), вот код в трех частях вместе с обещанием благодарности за любая помощь.
Во-первых, метод расширения с параметром Action:
//Extend ForEach to IEnumerated Files
public static IEnumerable<HttpPostedFileWrapper> ForEach<T>(this IEnumerable<HttpPostedFileWrapper> source, Action<HttpPostedFileWrapper> action)
{
//breaks on first 'item' init
foreach (HttpPostedFileWrapper item in source)
action(item);
return source;
}
Ошибка возникает, когда внутренний цикл foreach попадает в «элемент» в «источнике».
Вот вызывающий код (переменные MaxFileTries и attachPath правильно установлены ранее):
var files = Request.Files.Cast<HttpPostedFile>()
.Select(file => new HttpPostedFileWrapper(file))
.Where(file => file.ContentLength > 0
&& file.ContentLength <= MaxFileSize
&& file.FileName.Length > 0)
.ForEach<HttpPostedFileWrapper>(f => f.SaveUpload(attachPath, MaxFileTries));
И, наконец, цель действия, сохранение файла загрузки - мы, кажется, даже не доберемся до этого, но на всякий случай вот он:
public static HttpPostedFileWrapper SaveUpload(this HttpPostedFileWrapper f, string attachPath, int MaxFileTries)
{
// we can only upload the same file MaxTries times in one session
int tries = 0;
string saveName = f.FileName.Substring(f.FileName.LastIndexOf("\\") + 1); //strip any local
string path = attachPath + saveName;
while (File.Exists(path) && tries <= MaxFileTries)
{
tries++;
path = attachPath + " (" + tries.ToString() + ")" + saveName;
}
if (tries <= MaxFileTries)
{
if (!Directory.Exists(attachPath)) Directory.CreateDirectory(attachPath);
f.SaveAs(path);
}
return f;
}
Я признаю, что некоторые из вышеперечисленных - это совокупность «найденных кусочков», так что я, вероятно, получаю то, что заслуживаю, но если кто-то хорошо понимает это (или, по крайней мере, прошел через это), возможно, я смогу чему-то научиться.
Спасибо за любой.
Request.Files.Cast<HttpPostedFile>().Select(file => new HttpPostedFileWrapper(file)).Where( file => file.ContentLength > 0 && file.ContentLength <= MaxFileSize && file.FileName.Length > 0).ToList<HttpPostedFileWrapper>().ForEach(file=>file.SaveUpload(attachPath,MaxFileTries) );
с тем же результатом - person Serexx   schedule 11.03.2011T
вForEach<T>
? - person Heinzi   schedule 11.03.2011