2010-02-24 115 views
2

这是我的第一个问题。感谢所有对本网站有所贡献的人,在我尝试教授自己的编程时,这是一个巨大的帮助。保存上传图片的问题

我在保存上传图片时遇到问题。我认为我在做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 

感谢这么多的帮助!

+0

您应该在循环中调用'pic.InputStream.Read',因为它不能保证一次全部读取。 (检查它的返回值) – SLaks 2010-02-24 04:17:45

+0

谢谢SLaks。我到底该怎么做? – Solomon 2010-02-24 16:24:25

回答

2

你想转换图像为JPEG?

如果不是,则应该致电pic.Save(@"C:\text.jpg")

您可能会遇到错误,因为ASP.Net不具有对C:驱动器根目录的写入权限。 (GDI +可以给出有趣的错误)
这段代码如何以及在哪里运行? (卡西尼?IIS?)

+0

谢谢!我试图硬编码的文件路径,但得到了同样的错误。代码正在我的本地机器上运行(Visual Studio中的旧F5),所以我认为它是IIS。 我希望图片是JPEG。 – Solomon 2010-02-24 16:18:43

+0

如果你在VS中按F5,你正在运行卡西尼。 – SLaks 2010-02-24 16:19:39

+0

尝试将其更改为'pic.Save(@“C:\ text.jpg”)'并查看它是否给出错误。 – SLaks 2010-02-24 16:21:21

1

我只想找出你想要保存它相对于Web服务器,那意思就是文件服务器,然后将其保存。

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

除非他想将其转换为jpeg。 – SLaks 2010-02-24 14:01:44

+0

谢谢!我的托管服务提供商(rackspace)是中等信任,我需要使用绝对路径,而不是相对路径,尽管当我部署时... – Solomon 2010-02-24 16:11:39

+0

'Server.MapPath'返回一个绝对路径。假设你有对路径的写入权限,这段代码应该可以工作。 (你可能不这样做) – SLaks 2010-02-24 16:20:48