网站中文件或图片的路径问题

    今天在做集团网站的博客子系统的时候遇到了一个问题,图片路径问题。系统使用数据库存储图片路径,然后系统中的各个页面从数据库中获取路径显示图片。路径用如下方式存储(~/admin/blog/potho/1235.jpg)。因为需要显示图片的页面在网站的不同目录下。所以开始考虑使用如上方式存储。使用.net的asp:Image控件能够正常显示图片。但是如果要将图片路径放在<a>标记的href属性中,就会出现如下形式的路径(http://localhost/web/admin/blog/~/admin/blog/potho/1235.jpg),导致路径出现错误。原因可能是a标记不会解析波浪线。

     因此考虑在数据库中存储相对路径,格式如下:admin/blog/potho/1235.jpg。这样在使用图片路径的时候就需要对路径进行拼接。获取网站的根路径加上图片的路径得到完整路径。例如:根路径(http://localhost/)+ 图片路径(admin/blog/potho/1235.jpg)。这样在a标记中就不会再出现问题。但是如果将网站配置成为虚拟目录的话,问题又出现了,因为根路径变为了(http://localhost/web/)这种形式,在以后客户部署时可能还会变。所以要将这个可变的因素拿出来,变为可动态配置。可以考虑放入web.config文件中,因为此文件中的内容不需要编译。这样在我们部署网站时就可以灵活的修改路径了。

    接下来测试asp:Image控件,对控件的ImgeUrl使用如下方式邦定了数据:ImageUrl='<%#Common.GetRootPath() %><%# Eval("smallpthotaddress") %>',运行时出现了错误。错误信息是:CS1040: 预处理器指令必须作为一行的第一个非空白字符出。查看错误源可以看到:dataBindingExpressionBuilderTarget.ImageUrl = System.Convert.ToString(Common.GetRootPath() %><%# Eval("smallpthotaddress") , System.Globalization.CultureInfo.CurrentCulture);注意看标黄的部分,显然两个表达式被传入Convert.ToString方法转换为字符串,但我们的表达式却没有被正常解析。原因是什么呢,一个邦定表达式的时候并不会出现问题。难道不能放两个标达式。但在a标记中是同样的写法怎么就没问题呢,a标记的绑定原来被解释成如下格式:target.SetDataBoundString(0, System.Convert.ToString(Common.GetRootPath(), System.Globalization.CultureInfo.CurrentCulture));target.SetDataBoundString(1, System.Convert.ToString(Eval("photoPath"), System.Globalization.CultureInfo.CurrentCulture));看来.net环境对服务器端控件和客户端控件的解析方式不同,所以在对asp:Image控件绑定时才会出现问题。好,问题的根源找到了,那就想个办法解决,.net环境的解析方式我们左右不了,那就给asp:Image控件绑定一个表达式,改为如下绑定方式:'<%#Common.GetAbsolutePath( Eval("smallpthotaddress").ToString()) %>'。问题解决。

    总结:在做网站的时候将上传得文件和图片尽量放在一个文件目录。方便管理,因为可能很多人都会用到。获取路径的方法写成公共方法,所有人都使用此方法获取路径。路径需要改动的最好把改动的部分变为可配置的。存储路径时将路径存储为相对路径。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值