none
【ASP.NET】System.Drawing.Image.FromFile(f.FileName) 远程访问图片出错 RRS feed

  • 问题

  •  

    “/”应用程序中的服务器错误。

    C:\Documents and Settings\Administrator\桌面\48cdc5e7a2ceec1161a4c87f9819718f.jpg

    说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

    异常详细信息: System.IO.FileNotFoundException: C:\Documents and Settings\Administrator\桌面\48cdc5e7a2ceec1161a4c87f9819718f.jpg

    源错误:

     

    行 304: {
    行 305:
    行 306: System.Drawing.Image orimg = System.Drawing.Image.FromFile(f.FileName);
    行 307: string orwidth = orimg.Width.ToString();//原始宽度
    行 308: string orheight = orimg.Height.ToString();//原始宽度


    源文件: e:\WebJob\www_xinhuaprs_com\Web\App_Admin\proope\Add.aspx.cs    行: 306

    堆栈跟踪:

    [FileNotFoundException: C:\Documents and Settings\Administrator\桌面\48cdc5e7a2ceec1161a4c87f9819718f.jpg]
    System.Drawing.Image.FromFile(String filename, Boolean useEmbeddedColorManagement) +379411
    System.Drawing.Image.FromFile(String filename) +6
    App_Admin_proope_Add.AddImg(HttpPostedFile f, String weight, String height, String itype, String mode, String extension, String fname) in e:\WebJob\www_xinhuaprs_com\Web\App_Admin\proope\Add.aspx.cs:306
    App_Admin_proope_Add.btnSubmit_Click(Object sender, EventArgs e) in e:\WebJob\www_xinhuaprs_com\Web\App_Admin\proope\Add.aspx.cs:189
    System.Web.UI.WebControls.Button.OnClick(EventArgs e) +111
    System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +110
    System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10
    System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13
    System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +36
    System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1565

     在本地上传图片没有问题,为什么到远程上传图片却出现这个问题呢?源代码如下:

     

        /// <summary>
        /// 添加图片
        /// </summary>
        /// <param name="weight">上传对象</param>
        /// <param name="weight">宽度</param>
        /// <param name="height">高度</param>
        /// <param name="itype">图片种类</param>
        /// <param name="mode">剪切模式</param>
        /// <param name="category">文件扩展名</param>
        /// <param name="category">新文件名</param>
        private void AddImg(HttpPostedFile f, string weight, string height, string itype, string mode, string extension,string fname)
        {

            System.Drawing.Image orimg = System.Drawing.Image.FromFile(f.FileName);
            string orwidth = orimg.Width.ToString();//原始宽度
            string orheight = orimg.Height.ToString();//原始宽度

        }

     

    其中f是之前传递过来的file控件对象。调用方法代码如下:

    AddImg(this.file.PostedFile, weight, height, itype, mode, extension,fname);

    在本地跟踪了下是有值得,远程上传就出现错误,我怀疑是文件夹权限的引起的问题,不知道如何解决。请高手帮忙看看,先谢谢了!


    煜诚海参专卖 淘宝店铺:http://jinweb.taobao.com
    2011年5月13日 10:16

答案

  •  

    “/”应用程序中的服务器错误。

    C:\Documents and Settings\Administrator\桌面\48cdc5e7a2ceec1161a4c87f9819718f.jpg

    说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

    异常详细信息: System.IO.FileNotFoundException: C:\Documents and Settings\Administrator\桌面\48cdc5e7a2ceec1161a4c87f9819718f.jpg

    源错误:

     

    行 304: {
    行 305:
    行 306: System.Drawing.Image orimg = System.Drawing.Image.FromFile(f.FileName);
    行 307: string orwidth = orimg.Width.ToString();//原始宽度
    行 308: string orheight = orimg.Height.ToString();//原始宽度


    源文件: e:\WebJob\www_xinhuaprs_com\Web\App_Admin\proope\Add.aspx.cs    行: 306

    堆栈跟踪:

    [FileNotFoundException: C:\Documents and Settings\Administrator\桌面\48cdc5e7a2ceec1161a4c87f9819718f.jpg]
    System.Drawing.Image.FromFile(String filename, Boolean useEmbeddedColorManagement) +379411
    System.Drawing.Image.FromFile(String filename) +6
    App_Admin_proope_Add.AddImg(HttpPostedFile f, String weight, String height, String itype, String mode, String extension, String fname) in e:\WebJob\www_xinhuaprs_com\Web\App_Admin\proope\Add.aspx.cs:306
    App_Admin_proope_Add.btnSubmit_Click(Object sender, EventArgs e) in e:\WebJob\www_xinhuaprs_com\Web\App_Admin\proope\Add.aspx.cs:189
    System.Web.UI.WebControls.Button.OnClick(EventArgs e) +111
    System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +110
    System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10
    System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13
    System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +36
    System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1565

     在本地上传图片没有问题,为什么到远程上传图片却出现这个问题呢?源代码如下:

     

        /// <summary>
        /// 添加图片
        /// </summary>
        /// <param name="weight">上传对象</param>
        /// <param name="weight">宽度</param>
        /// <param name="height">高度</param>
        /// <param name="itype">图片种类</param>
        /// <param name="mode">剪切模式</param>
        /// <param name="category">文件扩展名</param>
        /// <param name="category">新文件名</param>
        private void AddImg(HttpPostedFile f, string weight, string height, string itype, string mode, string extension,string fname)
        {

            System.Drawing.Image orimg = System.Drawing.Image.FromFile(f.FileName);
            string orwidth = orimg.Width.ToString();//原始宽度
            string orheight = orimg.Height.ToString();//原始宽度

        }

     

    其中f是之前传递过来的file控件对象。调用方法代码如下:

    AddImg(this.file.PostedFile, weight, height, itype, mode, extension,fname);

    在本地跟踪了下是有值得,远程上传就出现错误,我怀疑是文件夹权限的引起的问题,不知道如何解决。请高手帮忙看看,先谢谢了!


    煜诚海参专卖 淘宝店铺:http://jinweb.taobao.com


    问题已经解决,

     

    System.Drawing.Image.FromFile()获取客户端图片的弊端
    下面是一个通过FromFile()获取客户端图片,并可以在保存之前改变图片大小的问题

    //创建位图
    System.Drawing.Bitmap bmp;

    string UploadFileName = "";
    string UploadFileDestination = "";
    UploadFileName = UploadFile.PostedFile.FileName;
    Response.ContentType="image/jpeg";
    System.Drawing.Image img=System.Drawing.Image.FromFile(UploadFileName);  
    if(img.Width>600 || img.Height>400)
    {
           bmp=new System.Drawing.Bitmap(img,600,400);
    }
    else
    {
       bmp=new System.Drawing.Bitmap(img,img.Width,img.Height);
    }
    string fileTime=DateTime.Now.Year.ToString()+DateTime.Now.Month.ToString()+DateTime.Now.Day.ToString()+DateTime.Now.Hour.ToString() +DateTime.Now.Minute.ToString()+DateTime.Now.Second.ToString()+DateTime.Now.Millisecond.ToString();
    string fileExtName=UploadFileName.Substring(UploadFileName.LastIndexOf("."));

    //UploadFileName = UploadFileName.Substring(UploadFileName.LastIndexOf("\\")+1); UploadFileName="\\"+fileTime+fileExtName;
    //获取服务器根目录的物理路径
    UploadFileDestination = HttpContext.Current.Request.PhysicalApplicationPath;
    //指定你上传文件的文件夹,注意开放权限
    UploadFileDestination += "upfiles";
    UploadFileDestination += "\\";
    //保存位图
    bmp.Save(UploadFileDestination + UploadFileName,System.Drawing.Imaging.ImageFormat.Jpeg);

    注意了:用FromFile()获取客户端的文件会产生这样一个问题,在有的机子上能上传成功,而有的则不能。这是为什么呢?这与系统NTFS文件格式有关,在客户端文件夹的访问权限要设置成Everyone开放。因此用FromFile()获取客户端文件进行操作并不是好方法,有了种更好的办法就是用流操作,具体如下:
    把上面代码中的System.Drawing.Image img=System.Drawing.Image.FromFile(UploadFileName);
    改为:
    System.Drawing.Image img=System.Drawing.Image.FromStream(UploadFile.PostedFile.InputStream);
    这种方法不会受到权限的干扰,因为它是把客户端文件读到内存当中,而内存并不存在权限的问。
    那也不是说使用FromFile()就不行,其实可以通过将客户端文件获取后先存在服务器端进行操作,将操作后的文件存为一个新的文件后删除原文件.


    煜诚海参专卖 淘宝店铺:http://jinweb.taobao.com
    • 已标记为答案 jinwb1982 2011年5月14日 2:05
    2011年5月14日 2:04