PDA

View Full Version : سوال: خطای system.NotSupportedException برای فشرده سازی عکس



leilast
سه شنبه 14 شهریور 1396, 20:22 عصر
سلام
من این کد رو برای تغییر و فشرده سازی عکس استفاده کردم اما موقعی که برنامه اجرا میشه این خطای system.NotSupportedException میده.
به خط آخر یعنی img.save خطا میگیره.
ممنون میشم بگید اشکال کار کجاس؟
من از ویژوال استودیو2017 و mvc استفاده میکنم.
متن دقیق خطا هم این هست:the given path format is not supported



public static void CompressImage(this System.Drawing.Image img, string path, ImageComperssion ic)
{
System.Drawing.Imaging.EncoderParameter qualityParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Qu ality, Convert.ToInt32(ic));
ImageFormat format = img.RawFormat;
ImageCodecInfo codec = ImageCodecInfo.GetImageDecoders().FirstOrDefault(c => c.FormatID == format.Guid);
string mimeType = codec == null ? "image/jpeg" : codec.MimeType;
ImageCodecInfo jpegCodec = null;
ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();
for (int i = 0; i < codecs.Length; i++)
{
if (codecs[i].MimeType == mimeType)
{
jpegCodec = codecs[i];
break;
}
}
EncoderParameters encoderParams = new EncoderParameters(1);
encoderParams.Param[0] = qualityParam;
img.Save(path, jpegCodec, encoderParams);
}




ممنون

رامین مرادی
چهارشنبه 15 شهریور 1396, 08:01 صبح
سلام
من این کد رو برای تغییر و فشرده سازی عکس استفاده کردم اما موقعی که برنامه اجرا میشه این خطای system.NotSupportedException میده.
به خط آخر یعنی img.save خطا میگیره.
ممنون میشم بگید اشکال کار کجاس؟
من از ویژوال استودیو2017 و mvc استفاده میکنم.
متن دقیق خطا هم این هست:the given path format is not supported



public static void CompressImage(this System.Drawing.Image img, string path, ImageComperssion ic)
{
System.Drawing.Imaging.EncoderParameter qualityParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Qu ality, Convert.ToInt32(ic));
ImageFormat format = img.RawFormat;
ImageCodecInfo codec = ImageCodecInfo.GetImageDecoders().FirstOrDefault(c => c.FormatID == format.Guid);
string mimeType = codec == null ? "image/jpeg" : codec.MimeType;
ImageCodecInfo jpegCodec = null;
ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();
for (int i = 0; i < codecs.Length; i++)
{
if (codecs[i].MimeType == mimeType)
{
jpegCodec = codecs[i];
break;
}
}
EncoderParameters encoderParams = new EncoderParameters(1);
encoderParams.Param[0] = qualityParam;
img.Save(path, jpegCodec, encoderParams);
}




ممنون

مقدار متغییر path رو هم بزارید اینجا

leilast
چهارشنبه 15 شهریور 1396, 10:41 صبح
این کد رو در قسمت کنترلر نوشتم که path مقدار دهی شده.



var filename = Path.GetFileName(UploadImage.FileName);
var path = Path.Combine(Server.MapPath("~/Files/UploadImages/"), filename);
UploadImage.SaveAs(path);

رامین مرادی
چهارشنبه 15 شهریور 1396, 11:03 صبح
وب کار نکردم ولی به این شکل بنویسید ببینید بازم خطا میده


var filename = Path.GetFileName(UploadImage.FileName);
var path = Path.Combine(Server.MapPath("~")+"/Files/UploadImages/", filename);
UploadImage.SaveAs(path);

leilast
چهارشنبه 15 شهریور 1396, 12:51 عصر
ییخشید من قسمتی که کد رو صدا زدم نذاشتم.
کد رو به این صورت نوشتم


public ActionResult AddProduct(Product product, HttpPostedFileBase UploadImage)
{
ProductRepository blProduct = new ProductRepository();
if (ModelState.IsValid)
{
var filename = Path.GetFileName(UploadImage.FileName);
var path =Path.Combine(Server.MapPath("~") + "/Files/UploadImages/", filename);

UploadImage.InputStream.ResizeImageByWidth(500, path, utility ImageComperssion.notmal);



خود کلاس utility هم به این شکله

public enum ImageComperssion
{
Maximum = 50,
Good = 60,
Normal = 70,
Fast = 80,
Minimum = 90,
}
public static void ResizeImageByWidth(this Stream inputStream, int width, string savePath, ImageComperssion ic = ImageComperssion.Normal)
{
System.Drawing.Image img = new Bitmap(inputStream);
int height = img.Height * width / img.Width;
System.Drawing.Image result = new Bitmap(width, height, PixelFormat.Format24bppRgb);
using (Graphics g = Graphics.FromImage(result))
{
g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQu ality;
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQua lityBicubic;
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality ;
g.DrawImage(img, 0, 0, width, height);
}
result.CompressImage(savePath, ic);
}

public static void CompressImage(this System.Drawing.Image img, string path, ImageComperssion ic)
{
System.Drawing.Imaging.EncoderParameter qualityParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Qu ality, Convert.ToInt32(ic));
ImageFormat format = img.RawFormat;
ImageCodecInfo codec = ImageCodecInfo.GetImageDecoders().FirstOrDefault(c => c.FormatID == format.Guid);
string mimeType = codec == null ? "image/jpeg" : codec.MimeType;
ImageCodecInfo jpegCodec = null;
ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();
for (int i = 0; i < codecs.Length; i++)
{
if (codecs[i].MimeType == mimeType)
{
jpegCodec = codecs[i];
break;
}
}
EncoderParameters encoderParams = new EncoderParameters(1);
encoderParams.Param[0] = qualityParam;
img.Save(path, jpegCodec, encoderParams);
}




در واقع تصویر هم اصلا آپلود نمیشه

رامین مرادی
چهارشنبه 15 شهریور 1396, 13:09 عصر
کلا اون مسیر تو سرور وجود داره؟؟!! قبل از آپلود یه شرط بزارید ببینید اون مسیر وجود داره یا نه

leilast
چهارشنبه 15 شهریور 1396, 13:47 عصر
بله فایل هستش.

رامین مرادی
چهارشنبه 15 شهریور 1396, 13:53 عصر
بله فایل هستش.

نه منظورم اینه یه فایل بزارید تو اون پوشه بعد با تابع Existe ببنید اون فایل وجود داره یا نه

Mahmoud.Afrad
چهارشنبه 15 شهریور 1396, 19:53 عصر
کدهای سی شارپ شما مشکلی نداره. اگر میتونید یک نمونه پروژه با یک صفحه که فقط عملیات روی عکس را انجام میده ایجاد کنید و در صورتی که خطا داشت، پروژه را اینجا قرار بدید.

رامین مرادی
پنج شنبه 16 شهریور 1396, 08:13 صبح
ییخشید من قسمتی که کد رو صدا زدم نذاشتم.


در واقع تصویر هم اصلا آپلود نمیشه

شما تو این خط
img.Save(path, jpegCodec, encoderParams);

یه دونه برک پوینت بزارید و وقتی اجرای برنامه به اون خط رسید مقدار path رو اینجا قرار بدید. چون از خطایی که میده معلومه با مسیر دهی مشکل داره.

leilast
پنج شنبه 16 شهریور 1396, 23:38 عصر
من یه سری تغییر توی کد دادم. کد رو درست کنم میزارمش اینجا.

leilast
شنبه 18 شهریور 1396, 14:17 عصر
من تمام فیلدهای دیگه ام رو پاک کردم از قرم و یه تیبل جدید ساختم که فقط روی آپلود عکس تمرکز کنم. بعد از اون برم سراغ فشره سازیش. فکر کردم اشکال باید ریشه ای باشه.
اما علیرغم این که هیچ خطایی بوجود نمیاد و حتی پیغام آپلود موفق هم نمایش داده میشه اما عکس نه در مسیری که بهش دادم ذخیره میشه و نه در دیتابیس!!
این کد رو برای کنترلر نوشتم.


[HttpGet]
public ActionResult UploadFiles()
{
return View();
}
[HttpPost]
public ActionResult UploadFiles(HttpPostedFileBase file)
{
if (ModelState.IsValid)
{
try
{
//Method 1 Get file details from current request
//Uncomment following code if you wants to use method 1
//if (Request.Files.Count > 0)
// {
// var Inputfile = Request.Files[0];


// if (Inputfile != null && Inputfile.ContentLength > 0)
// {
// var filename = Path.GetFileName(Inputfile.FileName);
// var path = Path.Combine(Server.MapPath("~/uploadedfile/"), filename);
// Inputfile.SaveAs(path);
// }
// }


//Method 2 Get file details from HttpPostedFileBase class


if (file != null)
{

string path = Path.Combine(Server.MapPath("~") +"/Files/UploadImages", Path.GetFileName(file.FileName));
file.SaveAs(path);


}
ViewBag.FileStatus = "File uploaded successfully.";
}
catch (Exception)
{


ViewBag.FileStatus = "Error while file uploading.";
}


}
return View();
}


این هم کد ویو هست .





@using (Html.BeginForm("UploadFiles", "Admin", FormMethod.Post, new { enctype = "multipart/form-data" })) {
@Html.AntiForgeryToken()

<div class="form-horizontal">
<h4>File</h4>
<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="form-group">
@Html.LabelFor(model => model.Images, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Images, new { htmlAttributes = new { @class = "form-control", @type = "file" } })
@Html.ValidationMessageFor(model => model.Images, "", new { @class = "text-danger" })
</div>
</div>


<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Create" class="btn btn-default" />
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10 text-success">
@ViewBag.FileStatus
</div>
</div>
</div>
}


<div>
@Html.ActionLink("Back to List", "Index")
</div>


<script src="~/Scripts/jquery-1.10.2.min.js"></script>
<script src="~/Scripts/jquery.validate.min.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>



این هم دیتابیسم که خالی هست.


دیگه واقعا نمی دونم باید چیکار کنم.:ناراحت:

leilast
شنبه 18 شهریور 1396, 22:44 عصر
روی خط ۳۶ از کد کنترلر هم که breakpoint می ذارم path=null نشون میده.
پروژه رو اینجا بذارم؟

Mahmoud.Afrad
یک شنبه 19 شهریور 1396, 01:51 صبح
در کدهاتون اصلا کنترلی برای آپلود فایل وجود نداره. به جای تکست باکس(@Html.EditorFor) باید از FileUpload استفاده کنید.

مثال ساده:
کنترلر
public class UploadController : Controller
{
[HttpGet]
public ActionResult Index()
{
return View();
}

[HttpPost]
public ActionResult Index(HttpPostedFileBase file)
{
if (file != null && file.ContentLength > 0)
{
if (IsImage(file))
{
try
{
string path = Path.Combine(Server.MapPath("~/Images"), Path.GetFileName(file.FileName));
file.SaveAs(path);
ViewBag.Message = "File uploaded successfully";
}
catch (Exception ex)
{
ViewBag.Message = "ERROR: " + ex.Message;
}
}
else
{
ViewBag.Message = "File is not image";
}
}
else
{
ViewBag.Message = "You have not specified a file.";
}
return View();
}

private bool IsImage(HttpPostedFileBase file)
{
if (file.ContentType.Contains("image"))
{
return true;
}

string fileExtension = Path.GetExtension(file.FileName);
if (fileExtension == null) throw new ArgumentNullException(nameof(fileExtension));
string[] formats = new string[] {".jpg", ".png", ".gif", ".jpeg"}; // add more if u like...

return formats.Any(item => fileExtension.Equals(item, StringComparison.OrdinalIgnoreCase));
}
}

ویو

@{
Layout = null;
}

<h2>File Upload</h2>
@using (Html.BeginForm("Index", "Upload", FormMethod.Post, new {enctype = "multipart/form-data"}))
{
<label for="file">Upload Image:</label>
<input type="file" name="file" id="file"/>
<br>
<br>
<input type="submit" value="Upload Image"/>
<br>
<br>
@ViewBag.Message
}

leilast
یک شنبه 19 شهریور 1396, 10:16 صبح
خب عکس در روت سرور آپلود میشه اما دیتابیس و فولدر داخل خود پروژه (همون که عکسش رو چند تا پست قبل گذاشتم ) همچنان خالی هست.
چطور میشه عکس در همون فولدر در روت نمایش داده بشه اما از خود پروژه قابل دیدن نباشه؟

Mahmoud.Afrad
یک شنبه 19 شهریور 1396, 18:20 عصر
کد ثبت در دیتابیس را هم ننوشتید به همین دلیل چیزی در دیتابیس ثبت نمیشه.

leilast
یک شنبه 19 شهریور 1396, 18:44 عصر
بله کد ثبت در دیتابیس رو ننوشتم ولی خود فولدر آپلود چطور؟
چطور تو روت نشون میده ولی داخل پروژه نشون نمیده؟

mr.sirwan
یک شنبه 19 شهریور 1396, 20:32 عصر
بله کد ثبت در دیتابیس رو ننوشتم ولی خود فولدر آپلود چطور؟
چطور تو روت نشون میده ولی داخل پروژه نشون نمیده؟

منظورتون اینه از طریق Solution Explorer داخل visual studio قادر به مشاهده برخی از فایل ها نیستید؟ اگر منظورتون اینه، گزینه ای که توی شکل زیر مشخص کردم رو بزنین تمام فایل هایی که داخل پروژه هستن رو نمایش میده:
146304
اگرنه منظورتون رو واضحتر بگین