Докато правех основно валидиране на колекцията ASP.Net (4.0) Request.Files
(качване), реших да опитам с LINQ.
Колекцията е IEnumerable<T>
и затова не предлага ForEach. Глупаво реших да създам метод за разширение, който да свърши работата. Съжалявам, че не успях толкова много...
Изпълнението на метода за разширение (по-долу) предизвиква следната грешка:
Не може да се преведе обект от тип „System.String“ към тип „System.Web.HttpPostedFile“
Очевидно има нещо, което не получавам, но не мога да видя какво е, така че с риск да изглеждам като идиот (няма да е за първи път), ето кода в 3 части, заедно с обещание за благодарност за някаква помощ.
Първо, методът за разширение с параметър за действие:
//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