Код, который указан в списке, циклически перебирает файлы, и для каждого из них значение Image1
и Image2
одинаково. Когда вы загружаете 2 файла, они оба отображаются как изображение 2. Это было последнее изображение, примененное к обоим полям.
Попробуйте заменить цикл на что-то вроде этого, которое устанавливает поля по одному, если изображений достаточно.
FileHandler fh = new FileHandler();
if (Request.Files.Count > 0)
{
Createsubcat4.Image1 = fh.uploadedFileToByteArray(Request.Files[0]);
}
if (Request.Files.Count > 1)
{
Createsubcat4.Image2 = fh.uploadedFileToByteArray(Request.Files[1]);
}
db.AddToSubProductCategory4(Createsubcat4);
Если вам нужно открыть это, чтобы в будущем появилось больше изображений, вам нужно заменить поля Image1
и Image2
коллекцией изображений и снова использовать цикл, чтобы добавить каждое изображение в поле. Коллекция загруженных файлов. Примерно так:
FileHandler fh = new FileHandler();
foreach (HttpPostedFileBase uploadedImage in Request.Files)
{
Createsubcat4.Images.Add(fh.uploadedFileToByteArray(uploadedImage));
}
db.AddToSubProductCategory4(Createsubcat4);
db.SaveChanges();
EDIT:
Теперь, когда вы правильно сохраняете изображения, вам нужно еще раз взглянуть на действие GetImage
. Вы заметите, что правильно загружаете оба файла в память, однако, когда вы указываете результат действия (return new FileStreamResult(stream,"image/jpg");
), вы только когда-либо возвращаете первый поток. Вам нужен способ вернуть второй поток по запросу. Есть несколько способов сделать это: добавить другой входной параметр, чтобы указать, какое изображение загружать, или создать второе действие, которое возвращает только второе.
Чтобы создать настройку двух действий, ваш код будет выглядеть примерно так:
public ActionResult GetImage1(int id)
{
const string alternativePicturePath = @"/Content/question_mark.jpg";
MemoryStream stream;
SubProductCategory4 z = db.SubProductCategory4.Where(k => k.SubProductCategoryFourID == id).FirstOrDefault();
if (z != null && z.Image1 != null)
{
stream = new MemoryStream(z.Image1);
}
else
{
var path = Server.MapPath(alternativePicturePath);
stream = new MemoryStream();
var imagex = new System.Drawing.Bitmap(path);
imagex.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg);
stream.Seek(0, SeekOrigin.Begin);
}
return new FileStreamResult(stream,"image/jpg");
}
public ActionResult GetImage2(int id)
{
const string alternativePicturePath = @"/Content/question_mark.jpg";
MemoryStream stream;
SubProductCategory4 z = db.SubProductCategory4.Where(k => k.SubProductCategoryFourID == id).FirstOrDefault();
if (z != null && z.Image2 != null) // the difference is here
{
stream = new MemoryStream(z.Image2); // the difference is also here
}
else
{
var path = Server.MapPath(alternativePicturePath);
stream = new MemoryStream();
var imagex = new System.Drawing.Bitmap(path);
imagex.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg);
stream.Seek(0, SeekOrigin.Begin);
}
return new FileStreamResult(stream,"image/jpg");
}
Эти функции практически идентичны и могут быть легко выполнены 1, который принимает параметр для выбора загружаемого изображения.
public ActionResult GetImage(int id, int? imageNum)
{
imageNum = imageNum ?? 0;
const string alternativePicturePath = @"/Content/question_mark.jpg";
MemoryStream stream;
SubProductCategory4 z = db.SubProductCategory4.Where(k => k.SubProductCategoryFourID == id).FirstOrDefault();
byte[] imageData = null;
if (z != null)
{
imageData = imageNum == 1 ? z.Image1 : imageNum == 2 ? z.Image2 : null;
}
if (imageData != null)
{
stream = new MemoryStream(imageData);
}
else
{
var path = Server.MapPath(alternativePicturePath);
stream = new MemoryStream();
var imagex = new System.Drawing.Bitmap(path);
imagex.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg);
stream.Seek(0, SeekOrigin.Begin);
}
return new FileStreamResult(stream,"image/jpg");
}
Эта функция будет указывать imageNum
в качестве параметра запроса, например:
http://www.mydomain.com/controllerName/GetImage/{id}?imageNum={imageNum}