MVC 控制器,如何将图像文件直接传递给位图并保存
MVC Controller, How to pass an image file directly to Bitmap and save it
我正在尝试在 mvc 控制器中以指定格式保存文件,
通过将文件 'InputStream' 传递给位图对象,并保存位图,而不是保存文件本身...因为我想处理它。
第一步,我试着按照我说的写,然后传一个 png,然后传一个我在我的电脑上找到的 jpg 文件,但我收到以下错误:
GDI+ 中出现一般性错误。
我的代码如下:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "Id,HotelId")] Image image) //, HttpPostedFileBase file)
{
int arrayStartX;
if (ModelState.IsValid)
{
if (Request.Files.Count > 0)
{
var file = Request.Files[0];
if (file != null && file.ContentLength > 0)
{
var fileName = Path.GetFileName(file.FileName);
var pathMain = Path.Combine(Server.MapPath("~/Images/HotelGallery/"),
"Img" + image.HotelId + "_" + fileName.Remove(fileName.LastIndexOf('.')) + ".jpg");
//file.SaveAs(path);
try
{
file.InputStream.Seek(0, SeekOrigin.Begin);
Bitmap mainBmp = new Bitmap(file.InputStream);
mainBmp.Save(pathMain, ImageFormat.Jpeg);
您可以像下面这样尝试您的流代码:
// At this point the new bitmap has no MimeType
// Need to output to memory stream
using (var m = new MemoryStream())
{
dst.Save(m, format);
var img = Image.FromStream(m);
//TEST
img.Save("C:\test.jpg");
var bytes = PhotoEditor.ConvertImageToByteArray(img);
return img;
}
来源:A generic error occurred in GDI+, JPEG Image to MemoryStream
好吧,虽然我遇到 GDI+ 错误很艰难,但在过去经常遇到它,我从没想过我自己的文件系统可能出了问题。是的,虽然我总是将 GDI+ 视为恶魔,但这一次完全是我自己的错,(顺便说一句,微软应该提供更好的错误:@)问题是我没有生成目录,并且保存无法要么做。
所以我做了一些重构并完成了这个:
var fileName = Path.GetFileName(file.FileName);
var galleryDirectoryPath = Server.MapPath("~/Images/HotelGallery/");
var pathMain = Path.Combine(galleryDirectoryPath,
"Img" + image.HotelId + "_" + fileName.Remove(fileName.LastIndexOf('.')) + ".jpg");
if (!Directory.Exists(galleryDirectoryPath))
{
Directory.CreateDirectory(galleryDirectoryPath);
}
然后是剩下的代码。
我正在尝试在 mvc 控制器中以指定格式保存文件, 通过将文件 'InputStream' 传递给位图对象,并保存位图,而不是保存文件本身...因为我想处理它。
第一步,我试着按照我说的写,然后传一个 png,然后传一个我在我的电脑上找到的 jpg 文件,但我收到以下错误:
GDI+ 中出现一般性错误。
我的代码如下:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "Id,HotelId")] Image image) //, HttpPostedFileBase file)
{
int arrayStartX;
if (ModelState.IsValid)
{
if (Request.Files.Count > 0)
{
var file = Request.Files[0];
if (file != null && file.ContentLength > 0)
{
var fileName = Path.GetFileName(file.FileName);
var pathMain = Path.Combine(Server.MapPath("~/Images/HotelGallery/"),
"Img" + image.HotelId + "_" + fileName.Remove(fileName.LastIndexOf('.')) + ".jpg");
//file.SaveAs(path);
try
{
file.InputStream.Seek(0, SeekOrigin.Begin);
Bitmap mainBmp = new Bitmap(file.InputStream);
mainBmp.Save(pathMain, ImageFormat.Jpeg);
您可以像下面这样尝试您的流代码:
// At this point the new bitmap has no MimeType
// Need to output to memory stream
using (var m = new MemoryStream())
{
dst.Save(m, format);
var img = Image.FromStream(m);
//TEST
img.Save("C:\test.jpg");
var bytes = PhotoEditor.ConvertImageToByteArray(img);
return img;
}
来源:A generic error occurred in GDI+, JPEG Image to MemoryStream
好吧,虽然我遇到 GDI+ 错误很艰难,但在过去经常遇到它,我从没想过我自己的文件系统可能出了问题。是的,虽然我总是将 GDI+ 视为恶魔,但这一次完全是我自己的错,(顺便说一句,微软应该提供更好的错误:@)问题是我没有生成目录,并且保存无法要么做。
所以我做了一些重构并完成了这个:
var fileName = Path.GetFileName(file.FileName);
var galleryDirectoryPath = Server.MapPath("~/Images/HotelGallery/");
var pathMain = Path.Combine(galleryDirectoryPath,
"Img" + image.HotelId + "_" + fileName.Remove(fileName.LastIndexOf('.')) + ".jpg");
if (!Directory.Exists(galleryDirectoryPath))
{
Directory.CreateDirectory(galleryDirectoryPath);
}
然后是剩下的代码。