2011-09-20 44 views
1

我有一个系统,我上传单个文件到网络服务器。一旦上传,我会触发一个命令来生成不同大小的文件。ImageResizer - 错误转换PSD文件 - System.ArgumentException:参数无效

上传的文件是PSD,应该转换成PNG和JPG格式。

上传工作正常,我可以看到目录中的文件。但是,当“生成版本”命令被解雇我得到这个错误

“文件可能已损坏空,或者可能包含一个维度PNG图像大于65535”

这行

generatedFiles.Add(ImageBuilder.Current.Build(file, strDestinationPath, objResizeCommand, false, true)); 

完整的命令是

public IList<string> GenerateVersions(decimal id, string file, string filename) 
    { 
     List<string> generatedFiles = new List<string>(); 

     foreach (var tCmdSets in db.IMG_SETTINGS_CMDSETS.Where("it.SETTINGS_FOLDER_ID = @folderid", new ObjectParameter("folderid", id))) 
     { 
      var strDestinationPath = ImageResizer.Util.PathUtils.RemoveExtension(Path.Combine(tmpDefaultFolder, tCmdSets.SETTINGS_CMDSET_DESTINATION, filename)); 
      ResizeSettings objResizeCommand = new ResizeSettings(tCmdSets.SETTINGS_CMDSET_COMMAND); 
      generatedFiles.Add(ImageBuilder.Current.Build(file, strDestinationPath, objResizeCommand, false, true)); 
     } 
     return generatedFiles; 
    } 

和变量填充,直到错误是:

file "c:\\www\\upload\\masters\\Products\\upload_test.psd" string 
objResizeCommand {?maxwidth=800&maxheight=600&format=jpg}   ImageResizer.ResizeSettings 
strDestinationPath "c:\\www\\upload\\converted\\items\\big\\upload_test" string 

这里是堆栈跟踪

[ArgumentException: Parameter is not valid.] 
ImageResizer.ImageBuilder.LoadImage(Object source, ResizeSettings settings) in C:\Users\Administrator\Documents\resizer\Core\ImageBuilder.cs:186 

[ImageCorruptedException (0x80004005): File may be corrupted, empty, or may contain a PNG image with a single dimension greater than 65,535 pixels.] 
ImageResizer.ImageBuilder.LoadImage(Object source, ResizeSettings settings) in C:\Users\Administrator\Documents\resizer\Core\ImageBuilder.cs:190 
ImageResizer.ImageBuilder.Build(Object source, Object dest, ResizeSettings settings, Boolean disposeSource, Boolean addFileExtension) in C:\Users\Administrator\Documents\resizer\Core\ImageBuilder.cs:306 
imageController.Classes.ImageHandling.GenerateVersions2(String original) in C:\Users\tha\Documents\Visual Studio 2010\Projects\imageController\imageController\Classes\ImageHandling.cs:26 
imageController.Controllers.UploadController.UploadSingleFile(Decimal id, HttpPostedFileBase objFile) in C:\Users\tha\Documents\Visual Studio 2010\Projects\imageController\imageController\Controllers\UploadController.cs:62 
lambda_method(Closure , ControllerBase , Object[]) +261 
System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) +17 
System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +208 
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +27 
System.Web.Mvc.<>c__DisplayClass15.<InvokeActionMethodWithFilters>b__12() +55 
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) +263 
System.Web.Mvc.<>c__DisplayClass17.<InvokeActionMethodWithFilters>b__14() +19 
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +191 
System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +343 
System.Web.Mvc.Controller.ExecuteCore() +116 
System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +97 
System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) +10 
System.Web.Mvc.<>c__DisplayClassb.<BeginProcessRequest>b__5() +37 
System.Web.Mvc.Async.<>c__DisplayClass1.<MakeVoidDelegate>b__0() +21 
System.Web.Mvc.Async.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _) +12 
System.Web.Mvc.Async.WrappedAsyncResult`1.End() +62 
System.Web.Mvc.<>c__DisplayClasse.<EndProcessRequest>b__d() +50 
System.Web.Mvc.SecurityUtil.<GetCallInAppTrustThunk>b__0(Action f) +7 
System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action) +22 
System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +60 
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +9 
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +8897857 
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +184 
+0

我找到了解决方案,只要我能回答我自己的问题,就会发布它... \ T –

回答

1

解决

您需要将以下添加到您的web.config文件

<configSections> 
    <section name="resizer" type="ImageResizer.ResizerSection"/> 
</configSections> 

<resizer> 
<sizelimits /> 
<diskcache enabled="false" /> 
<remotereader signingKey="ag383ht23sag#laf#lafF#oyfafqewt;2t w eyfwfefwqefqw" allowAllSignedRequests="true" /> 
<plugins> 
    <add name="DiskCache" /> 
    <add name="PsdReader" /> 
    <add name="PrettyGifs" /> 
    <add name="Image404" /> 
    <add name="AnimatedGifs" /> 
    <add name="Gradient" /> 
    <add name="SimpleFilters" /> 
    <add name="RemoteReader" /> 
    <add name="AdvancedFilters" /> 
    <add name="CloudFront" /> 
    <add name="SeamCarving" /> 
    <add name="FolderResizeSyntax" /> 
    <add name="ImageHandlerSyntax" /> 
    <add name="MyCode.MyPlugins.SamplePlugin" /> 
    <add name="WhitespaceTrimmer" /> 
</plugins> 
</resizer> 

<httpModules> 
    <add name="ImageResizingModule" type="ImageResizer.InterceptModule"/> 
</httpModules> 

<modules runAllManagedModulesForAllRequests="true"> 
    <add name="ImageResizingModule" type="ImageResizer.InterceptModule"/> 
</modules> 

\ t

+0

您能否编辑您的答案以删除不相关的设置? –

0

事实上,所有你需要做的就是添加<add name="PsdReader" /><plugins/>部分。其他内容仅适用于URL语法,而不是托管API。

2

当使用ASP.NET托管API,但的HTTP模块,你需要调用

protected void Application_Start() 
{ 
    ImageResizer.Configuration.Config.Current.Plugins.LoadPlugins(); 
} 

Global.asax.cs中除了以下的web.config设置

<configSections> 
    <section name="resizer" type="ImageResizer.ResizerSection" requirePermission="false" /> 
</configSections> 

<resizer> 
    <plugins> 
    <add name="PsdReader" /> 
    </plugins> 
</resizer> 

否则当您不使用Http模块时插件将不会被注册。

你可以通过调用

ImageResizer.Configuration.Config.Current.GetDiagnosticsPage() 

该页面还显示了支持的文件类型验证插件正确加载(.PSD,如果插件正确加载)。

感谢Nathanael(ImageResizer的所有者)指点我的解决方案。

相关问题