保存上传的图像时出现问题

时间:2010-02-24 04:10:02

标签: c# asp.net-mvc

这是我的第一个问题。感谢所有为本网站做出贡献的人,在我尝试自学编程时,这是一个巨大的帮助。

我在保存上传的图片时遇到问题。我想我在使用image.save函数做错了。我的代码如下:

控制器:

[AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Index(string fileName, HttpPostedFileBase pic)
    {
        string mimeType = pic.ContentType;
        byte[] imagedata = new byte[pic.ContentLength];
        pic.InputStream.Read(imagedata, 0, pic.ContentLength);
        Image outfitImage = (Image.FromStream(new MemoryStream(imagedata)));
        string filePath = @"c:\test.jpg";
        outfitImage.Save(filePath);
        return View();
    }

查看:

<% using (Html.BeginForm("Index","Test" ,FormMethod.Post,new {enctype="multipart/form-data"})) {%>

    <fieldset>
        <legend>Fields</legend>
     <p>
            <label for="fileName">Name:</label>
            <%= Html.TextBox("fileName") %>
     </p>
     <p>
        Upload new image: <input type="file" name="pic" />
     </p>
     <p>
            <input type="submit" value="Create" />
     </p>
    </fieldset>
<% } %>

堆栈跟踪如下:

    Server Error in '/' Application.
A generic error occurred in GDI+.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.Runtime.InteropServices.ExternalException: A generic error occurred in GDI+.

Source Error:

Line 51:             
Line 52:             string filePath = @"c:\test.jpg";
Line 53:             outfitImage.Save(filePath);
Line 54: 
Line 55:             return View();


Source File: C:\Users\Solomon\SolomonApp\AmIStylin\AmIStylin\Controllers\TestController.cs    Line: 53

Stack Trace:

[ExternalException (0x80004005): A generic error occurred in GDI+.]
   System.Drawing.Image.Save(String filename, ImageCodecInfo encoder, EncoderParameters encoderParams) +377630
   System.Drawing.Image.Save(String filename, ImageFormat format) +69
   System.Drawing.Image.Save(String filename) +25
   AmIStylin.Controllers.TestController.Index(String fileName, HttpPostedFileBase pic) in C:\Users\Solomon\SolomonApp\AmIStylin\AmIStylin\Controllers\TestController.cs:53
   lambda_method(ExecutionScope , ControllerBase , Object[] ) +205
   System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) +17
   System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +178
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +24
   System.Web.Mvc.<>c__DisplayClassa.<InvokeActionMethodWithFilters>b__7() +52
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) +254
   System.Web.Mvc.<>c__DisplayClassc.<InvokeActionMethodWithFilters>b__9() +19
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +192
   System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +399
   System.Web.Mvc.Controller.ExecuteCore() +126
   System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +27
   System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) +7
   System.Web.Mvc.MvcHandler.ProcessRequest(HttpContextBase httpContext) +151
   System.Web.Mvc.MvcHandler.ProcessRequest(HttpContext httpContext) +57
   System.Web.Mvc.MvcHandler.System.Web.IHttpHandler.ProcessRequest(HttpContext httpContext) +7
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +181
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75


Version Information: Microsoft .NET Framework Version:2.0.50727.4062; ASP.NET Version:2.0.50727.3074 

非常感谢你的帮助!

3 个答案:

答案 0 :(得分:2)

您是否尝试将图片转换为JPEG格式?

如果没有,您应该致电pic.Save(@"C:\text.jpg")

您可能会收到错误,因为ASP.Net没有对C:驱动器根目录的写访问权限。 (GDI +可以给出有趣的错误)
这个代码的运行方式和位置是什么? (卡西尼?IIS?)

答案 1 :(得分:1)

我只想知道你想将它存储在哪里相对于web服务器,将其转换为文件服务器,然后保存它。

string relativePath = "~/somefolder/somefile.ext";
string diskPath = ControllerContext.HttpContext.Server.MapPath(newFileWebPath);
pic.SaveAs(diskPath);

答案 2 :(得分:-1)