ASP.NET Forums 2.0 修改集锦(二)

转载 2004年08月30日 14:47:00

今天我们要说的是“如何将论坛附件直接以文件形式保存,并读取照片文件的Exif信息;”

废话少说,直接进入主题:regular_smile.gif
      准备工作:下载PhotoProperties类库,用于读取Exif信息,在Components中引用该类库

1、修改web.config配置文件,在forums/forums下增加一个配置项
      uploadFilesPath="/Upload/"
      值可以自行修改,用来保存用户上传的文件;

2、修改数据库
      forums_PostAttachments表增加如下字段
      DiskFileName nvarchar(256),  保存附件在硬盘上的文件名
      Exif  nvarchar(200),    用于保存照片附件的Exif信息
      CheckGuid nvarchar(50)     用于保存检测的Guid
      注意:我们修改的最终方案是会删除原有的Content字段的

      修改存储过程:

None.gifcreate procedure forums_PostAttachment_Add 
None.gif(
None.gif    @PostID 
int
,
None.gif    @UserID 
int
,
None.gif    @ForumID 
int
,
None.gif    @Filename 
nvarchar(256
),
None.gif    @DiskFileName 
nvarchar(256
),
None.gif    @ContentType 
nvarchar(50
),
None.gif    @ContentSize 
int
,
None.gif    @Exif 
nvarchar(500
),
None.gif    @CheckGuid 
nvarchar(50
)
None.gif)
None.gif
AS
None.gif
BEGIN
None.gif
None.gif    
IF EXISTS (SELECT PostID FROM forums_PostAttachments WHERE PostID = @PostID)
None.gif        
RETURN

None.gif
None.gif    
INSERT INTO 
None.gif        forums_PostAttachments
None.gif    (
None.gif        PostID,
None.gif        ForumID,
None.gif        UserID,
None.gif        
[FileName]
,
None.gif        DiskFileName,
None.gif        ContentType,
None.gif        ContentSize,
None.gif        Exif,
None.gif        CheckGuid
None.gif    )
None.gif    
VALUES

None.gif    (
None.gif        @PostID,
None.gif        @ForumID,
None.gif        @UserID,
None.gif        @Filename,
None.gif        @DiskFileName,
None.gif        @ContentType,
None.gif        @ContentSize,
None.gif        @Exif,
None.gif        @CheckGuid
None.gif    )
None.gif
None.gif
END
None.gifNone.gif
None.gif
GO
None.gif
SET QUOTED_IDENTIFIER OFF 
None.gif
GO

None.gif
SET ANSI_NULLS ON 
None.gif
GO

None.gif
None.gif
SET QUOTED_IDENTIFIER ON 
None.gif
GO

None.gif
SET ANSI_NULLS ON 
None.gif
GO


     
3、修改系统配置管理类Components项目下的Configuration/ForumConfiguration.cs文件:
      1)在头部增加一变量

None.gifstring uploadFilesPath="/Upload/";
      2)在LoadValuesFromConfigurationXml方法里增加以下代码,读取配置文件中的值:
None.gifuploadFilesPath = attributeCollection["uploadFilesPath"].Value;
      3)给ForumConfiguration类增加UploadFilesPath属性:
ExpandedBlockStart.gif public string UploadFilesPath get return uploadFilesPath; } }
None.gif
      配置文件部分完成。

4、修改Components项目下的PostAttachment类
      增加如下引用:
None.gifusing System.IO;
None.gif
using JSG.PhotoPropertiesLibrary;

      增加如下变量:     
None.gifstring exif;
None.gif
string diskFileName;        
None.gif
string checkGuid;
     
     增加如下方法:
ExpandedBlockStart.gif/// <summary>
InBlock.gif        
/// 获取文件的Exif信息
InBlock.gif        
/// </summary>

InBlock.gif        
/// <param name="postedFile"></param>
ExpandedBlockEnd.gif        
/// <returns></returns>

None.gif        private string GetExif(string ContentType,string FullFileName) 
ExpandedBlockStart.gif        
{
InBlock.gif            
InBlock.gif            
InBlock.gif            
string imgFilePath =
 FullFileName;
InBlock.gif            
string exif=""
;
InBlock.gif            
InBlock.gif            
try

ExpandedSubBlockStart.gif            
{
InBlock.gif                PhotoProperties pp 
= new
 PhotoProperties();
InBlock.gif
InBlock.gif                pp.Initialize();
InBlock.gif                pp.Analyze(imgFilePath);
InBlock.gif                        
InBlock.gif                
if(ContentType.ToLower() == "image/pjpeg"
)
ExpandedSubBlockStart.gif                
{
InBlock.gif                    
//Exif Version

InBlock.gif
                    exif += "Exif版本:" +  pp.GetTagDatum(36864).PrettyPrintValue;
InBlock.gif
InBlock.gif                    
//制造商

InBlock.gif
                    exif += " 制造商:" + pp.GetTagDatum(271).PrettyPrintValue;
InBlock.gif
InBlock.gif                    
//型号

InBlock.gif
                    exif += " 型号:" + pp.GetTagDatum(272).PrettyPrintValue;
InBlock.gif
InBlock.gif                    
//拍摄时间

InBlock.gif
                    exif += " 拍摄时间:" + pp.GetTagDatum(36868).PrettyPrintValue;
InBlock.gif
InBlock.gif                    
//暴光时间:

InBlock.gif
                    exif += "<BR>暴光时间:" +  pp.GetTagDatum(33434).PrettyPrintValue + "";
InBlock.gif
InBlock.gif                    
//光圈

InBlock.gif
                    exif += " 光圈:" + pp.GetTagDatum(33437).PrettyPrintValue;
InBlock.gif
InBlock.gif                    
//ISO

InBlock.gif
                    exif += "  ISO:" + pp.GetTagDatum(34855).PrettyPrintValue;
InBlock.gif
InBlock.gif                    
//分辨率

InBlock.gif
                    exif += " 分辨率:" +  pp.GetTagDatum(282).PrettyPrintValue + "/" +  pp.GetTagDatum(283).PrettyPrintValue;
ExpandedSubBlockEnd.gif                }

ExpandedSubBlockEnd.gif            }

ExpandedSubBlockStart.gif            
catch{}
InBlock.gif
InBlock.gif            
return exif;
ExpandedBlockEnd.gif        }
       在构造函数的最下面增加:
None.gifstring uploadPath = HttpContext.Current.Server.MapPath("~" + AspNetForums.Configuration.ForumConfiguration.GetConfig().UploadFilesPath);
InBlock.gif            uploadPath 
+= "/" + Users.GetUser().UserID.ToString() + "/"
;
InBlock.gif            
if(!
System.IO.Directory.Exists(uploadPath))
ExpandedSubBlockStart.gif            
{
InBlock.gif                System.IO.Directory.CreateDirectory(uploadPath);
ExpandedSubBlockEnd.gif            }

InBlock.gif        
InBlock.gif            
//HttpContext.Current.User.Identity
InBlock.gif
            
InBlock.gif            diskFileName 
=  System.Guid.NewGuid().ToString() +
 System.IO.Path.GetExtension(postedFile.FileName);
InBlock.gif            uploadPath 
+=
 diskFileName;
InBlock.gif            
InBlock.gif            postedFile.SaveAs(uploadPath);
exif = GetExif(contentType,uploadPath);
None.gifcheckGuid 
= System.Guid.NewGuid().ToString();
      
      最后增加3个属性,代码如下:
ExpandedBlockStart.gif        /// <summary>
InBlock.gif        
/// 磁盘文件名(文件保存在硬盘上的物理文件名)
InBlock.gif        
///
 37AE8655-05F8-4ed9-A771-35B41F0222DE.ext
ExpandedBlockEnd.gif        
/// </summary>

None.gif        public string DiskFileName
ExpandedBlockStart.gif        
{
InBlock.gif            
get

ExpandedSubBlockStart.gif            
{
InBlock.gif                
return
 diskFileName;
ExpandedSubBlockEnd.gif            }

InBlock.gif            
set
ExpandedSubBlockStart.gif            
{
InBlock.gif                diskFileName 
=
 value;
ExpandedSubBlockEnd.gif            }

ExpandedBlockEnd.gif        }

None.gif
ExpandedBlockStart.gif        
/// <summary>
InBlock.gif        
/// 照片Exif信息
ExpandedBlockEnd.gif        
/// </summary>

None.gif        public string Exif 
ExpandedBlockStart.gif        
{
InBlock.gif            
get
 
ExpandedSubBlockStart.gif            
{
InBlock.gif                
return
 exif;
ExpandedSubBlockEnd.gif            }

InBlock.gif            
set 
ExpandedSubBlockStart.gif            
{
InBlock.gif                exif 
=
 value;
ExpandedSubBlockEnd.gif            }

ExpandedBlockEnd.gif        }

None.gif
ExpandedBlockStart.gif        
/// <summary>
InBlock.gif        
/// 用于判断是否要以attachment形式让用户下载附件
ExpandedBlockEnd.gif        
/// </summary>

None.gif        public string CheckGuid
ExpandedBlockStart.gif        
{
InBlock.gif            
get

ExpandedSubBlockStart.gif            
{
InBlock.gif                
return
 checkGuid;
ExpandedSubBlockEnd.gif            }

InBlock.gif            
set
ExpandedSubBlockStart.gif            
{
InBlock.gif                checkGuid 
=
 value;
ExpandedSubBlockEnd.gif            }

ExpandedBlockEnd.gif        }

5、下面要修改的是负责系统数据库操作的SqlDataProvider项目,用于完成对新增加字段的数据库操作,修改如下:
    找到public override void AddPostAttachment(Post post, PostAttachment attachment)方法:
None.gif//增加DiskFileName字段,用于附件在硬盘上的保存文件名,
None.gif
//
类似1990ffb3-3992-4438-b7e2-2bca963d969f.jpg
None.gif
//该文件名不暴露给最终用户

None.gif
myCommand.Parameters.Add("@DiskFileName", SqlDbType.NVarChar, 256).Value = attachment.DiskFileName;
None.gif
//
注释掉对Content的操作
None.gif
//
myCommand.Parameters.Add("@Content", SqlDbType.Image).Value = attachment.Content;
None.gif
None.gif
//增加照片Exif信息与用于验证的CheckGuid字段

None.gif
myCommand.Parameters.Add("@Exif",SqlDbType.NVarChar,500).Value = attachment.Exif;
None.gifmyCommand.Parameters.Add(
"@CheckGuid",SqlDbType.NVarChar,500).Value = attachment.CheckGuid;
     注意:这里需要注释掉对Content字段的操作,因为虽然数据字段还在,但上面修改的存储过程中,我们已经删除了对Content字段的操作;

6、修改Components项目下的ForumsDataProvider类中的PopulatePostAttachmentFromIReader方法,完成从数据库到对象的转换,修改如下:
None.gif//删除Content字段,附件内容不再保存到数据库,而是直接以文件形式保存到硬盘
None.gif
//
 attachment.Content      = (byte[]) reader["Content"];
None.gif
None.gif
//
增加DiskFileName字段,用于附件在硬盘上的保存文件名,
None.gif
//
类似1990ffb3-3992-4438-b7e2-2bca963d969f.jpg
None.gif
//该文件名不暴露给最终用户

None.gif
attachment.DiskFileName = (string) reader["DiskFileName"].ToString();
None.gif
None.gif
//增加照片Exif信息与用于验证的CheckGuid字段

None.gif
if(reader["Exif"!= DBNull.Value)
ExpandedBlockStart.gif
{
InBlock.gif    attachment.Exif        
= (string) reader["Exif"
];
ExpandedBlockEnd.gif}

None.gifattachment.CheckGuid    
= (string) reader["CheckGuid"].ToString();


7、到此数据的操作部分已经都完成了,下面要做的就是修改显示部分,系统最终显示帖子内容是通过Controls下的TextPost类完成的,我们要修改的代码当然也在这里了。
      找到InitializeSkin方法中的body.Text = post.FormattedBody;,在他下面增加如下代码:
None.gif            //判断附件的mime类型是否为图片,如果为图片,那么直接调用DisplayImage方法生成显示图片的HTML代码
None.gif            
//此处可扩充直接显示附件为Flash等其他类型的文件

None.gif
            string Attachment=post.AttachmentFilename;
None.gif            
if (Attachment!="" && Attachment!=null
)
ExpandedBlockStart.gif            
{
InBlock.gif                AspNetForums.Components.PostAttachment attachment 
=
 Posts.GetAttachment(post.PostID);
InBlock.gif                
string contentType =
 attachment.ContentType;
InBlock.gif                
if (contentType=="image/pjpeg"
 
InBlock.gif                    
|| contentType=="image/gif"

InBlock.gif                    
|| contentType=="image/bmp" 
InBlock.gif                    
|| contentType=="image/x-png"
 )
ExpandedSubBlockStart.gif                
{
InBlock.gif                    
InBlock.gif                    body.Text 
+= DisplayImage(Globals.GetSiteUrls().PostAttachment(post.PostID) + "&guid=" + attachment.CheckGuid);  
InBlock.gif        
InBlock.gif                
InBlock.gif                    
//显示Exif信息

InBlock.gif
                    if(attachment.Exif.Length>0)
ExpandedSubBlockStart.gif                    
{
InBlock.gif                        body.Text 
+= "<span class=exif>" + attachment.Exif + "</span>"
;
ExpandedSubBlockEnd.gif                    }

ExpandedSubBlockEnd.gif                }

ExpandedBlockEnd.gif            }
      DisplayImage方法很简单,代码如下,自己可以修改该代码,给图片增加边框等
ExpandedBlockStart.gif/// <summary>
InBlock.gif
/// 如果附件为图片类型,那么调用该方法,生成显示图片的HTML代码
InBlock.gif
/// </summary>

InBlock.gif
/// <param name="ImageFilePath">要显示的图片路径</param>
ExpandedBlockEnd.gif
/// <returns></returns>

None.gifpublic string DisplayImage(string ImageFilePath)
ExpandedBlockStart.gif    
{
InBlock.gif                
return "<a href='" + ImageFilePath + "' target='_blank'><img  src="" + ImageFilePath + "" border=0></a>"
;
ExpandedBlockEnd.gif        }

8、修改附件下载部分,Controls项目下的DownloadPostAttachment类,代码如下:
 
None.gif            System.Web.HttpContext.Current.Response.Clear();
None.gif            System.Web.HttpContext.Current.Response.ContentType 
= attachment.ContentType;
None.gif            
None.gif
None.gif            
//
判断用户从QueryString提交的Guid值是否和数据库的CheckGuid是否相同
None.gif            
//
如果相同,那么不以attachment的形式输出,直接显示文件(通常提供该Guid值的情况都是为图片附件)
None.gif            
//如果不同,那么以attachment形式输出,直接由用户下载

None.gif
            if(forumContext.CheckGuid != attachment.CheckGuid)
ExpandedBlockStart.gif            
{
InBlock.gif                System.Web.HttpContext.Current.Response.AppendHeader(
"content-disposition""attachment; filename="" + System.Web.HttpUtility.UrlEncode(attachment.FileName,System.Text.Encoding.UTF8) + """
);
ExpandedBlockEnd.gif            }

None.gif
None.gif            
//System.Web.HttpContext.Current.Response.OutputStream.Write(attachment.Content, 0, attachment.Length);
None.gif
                        
None.gif            
string diskFileName = System.Web.HttpContext.Current.Server.MapPath("~/" + AspNetForums.Configuration.ForumConfiguration.GetConfig().UploadFilesPath + "/" + attachment.UserID.ToString() + "/" +
 attachment.DiskFileName);
None.gif            System.Web.HttpContext.Current.Response.WriteFile(diskFileName);
None.gif            System.Web.HttpContext.Current.Response.End();


9、最后要修改的是ForumContext类,要对该类增加一个属性,用于读取通过QueryString传递的Guid值,找到Components项目下的ForumContext类,
      首先增加一变量:
None.gifstring checkGuid =  "";
     在构造函数的最下面增加:
None.gifcheckGuid = context.Request.QueryString["guid"];
     在最下面增加属性:
None.gif//CheckGuid 判断是否合法的显示文件请求
ExpandedBlockStart.gif
public string CheckGuid get return checkGuid; } }


至此,我们的修改工作已经全部完成,下面要做的就是对原有的数据库进行升级,将Content字段中的数据保存到硬盘,下面的代码比较简单了,直接贴出代码 regular_smile.gif
在web项目下增加一个页面,后台的操作代码如下,代码比较简单,都是直接操作数据库的。不要忘记增加对PhotoProperties的引用,
None.gifusing System;
None.gif
using
 System.Collections;
None.gif
using
 System.ComponentModel;
None.gif
using
 System.Data;
None.gif
using
 System.Data.SqlClient;
None.gif
using
 System.Drawing;
None.gif
using
 System.Web;
None.gif
using
 System.Web.SessionState;
None.gif
using
 System.Web.UI;
None.gif
using
 System.Web.UI.WebControls;
None.gif
using
 System.Web.UI.HtmlControls;
None.gif
None.gif
using
 System.IO;
None.gif
using
 JSG.PhotoPropertiesLibrary;
None.gif
None.gif
namespace
 AspNetForums.Update
ExpandedBlockStart.gif
{
ExpandedSubBlockStart.gif    
/// <summary>
InBlock.gif    
/// update_20040807 的摘要说明。
ExpandedSubBlockEnd.gif    
/// </summary>

InBlock.gif    public class update_20040807 : System.Web.UI.Page
ExpandedSubBlockStart.gif    
{
InBlock.gif        
protected
 System.Web.UI.WebControls.Button Button1;
InBlock.gif    
InBlock.gif        
private void Page_Load(object
 sender, System.EventArgs e)
ExpandedSubBlockStart.gif        
{
InBlock.gif            
// 在此处放置用户代码以初始化页面

ExpandedSubBlockEnd.gif
        }

InBlock.gif
ContractedSubBlock.gif        
Web 窗体设计器生成的代码
InBlock.gif
InBlock.gif        
private void Button1_Click(object sender, System.EventArgs e)
ExpandedSubBlockStart.gif        
{
InBlock.gif            
InBlock.gif            
string ConnectionString = "database=forums;server=dbserver;User ID=sa;Password=;"
;
InBlock.gif
InBlock.gif            SqlConnection myConn 
= new
 SqlConnection(ConnectionString);
InBlock.gif            myConn.Open();
InBlock.gif
InBlock.gif            
InBlock.gif            
InBlock.gif            
string select="select * from forums_PostAttachments"
;
InBlock.gif            SqlCommand myComm 
= new
 SqlCommand(select,myConn);
InBlock.gif
InBlock.gif            SqlDataReader dr 
=
 myComm.ExecuteReader();
InBlock.gif            
string
 DiskFileName,CheckGuid,Exif;
InBlock.gif            
string UpdateString="Update forums_PostAttachments SET DiskFileName='{0}',Exif='{1}',CheckGuid='{2}' where PostID={3}"
;
InBlock.gif            
string
 UserID;
InBlock.gif            
byte
[] fileContent;
InBlock.gif            FileStream fs
=null
;
InBlock.gif
InBlock.gif
InBlock.gif
InBlock.gif
InBlock.gif
InBlock.gif
InBlock.gif
InBlock.gif            SqlConnection myConn2 
= new
 SqlConnection(ConnectionString);
InBlock.gif            myConn2.Open();
InBlock.gif
InBlock.gif
InBlock.gif
InBlock.gif            
while
(dr.Read())
ExpandedSubBlockStart.gif            
{
InBlock.gif                UserID
=dr["UserID"
].ToString();
InBlock.gif                fileContent 
= (byte[])dr["Content"
];
InBlock.gif                DiskFileName 
= Server.MapPath("~/" + AspNetForums.Configuration.ForumConfiguration.GetConfig().UploadFilesPath + "/" + UserID + "/" + System.Guid.NewGuid().ToString()) + System.IO.Path.GetExtension(dr["FileName"
].ToString());
InBlock.gif                
InBlock.gif                CheckGuid 
=
 System.Guid.NewGuid().ToString();
InBlock.gif
InBlock.gif                fs
=new
 FileStream(DiskFileName ,FileMode.Create,FileAccess.Write, FileShare.ReadWrite);
InBlock.gif                fs.Write(fileContent,
0
,fileContent.Length);
InBlock.gif                fs.Close();
InBlock.gif                Exif 
=
 GetExif(DiskFileName);
InBlock.gif
InBlock.gif                SqlCommand myComm2 
= new SqlCommand(string.Format(UpdateString,System.IO.Path.GetFileName(DiskFileName),Exif,CheckGuid,dr["PostID"
].ToString()),myConn2);
InBlock.gif                myComm2.ExecuteNonQuery();
InBlock.gif                
ExpandedSubBlockEnd.gif            }

InBlock.gif            dr.Close();        
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif
InBlock.gif        
private string GetExif(string diskFileName) 
ExpandedSubBlockStart.gif        
{
InBlock.gif            
InBlock.gif            
string imgFilePath =
 diskFileName;
InBlock.gif            PhotoProperties pp 
= new
 PhotoProperties();
InBlock.gif
InBlock.gif            
string exif=""
;
InBlock.gif            
try

ExpandedSubBlockStart.gif            
{
InBlock.gif                pp.Initialize();
InBlock.gif                pp.Analyze(imgFilePath);
InBlock.gif            
InBlock.gif                
//Exif Version

InBlock.gif
                exif += "Exif版本:" +  pp.GetTagDatum(36864).PrettyPrintValue;
InBlock.gif
InBlock.gif                
//制造商

InBlock.gif
                exif += " 制造商:" + pp.GetTagDatum(271).PrettyPrintValue;
InBlock.gif
InBlock.gif                
//型号

InBlock.gif
                exif += " 型号:" + pp.GetTagDatum(272).PrettyPrintValue;
InBlock.gif
InBlock.gif                
//拍摄时间

InBlock.gif
                exif += " 拍摄时间:" + pp.GetTagDatum(36868).PrettyPrintValue;
InBlock.gif
InBlock.gif
InBlock.gif                
//暴光时间:

InBlock.gif
                exif += "<BR>暴光时间:" +  pp.GetTagDatum(33434).PrettyPrintValue + "";
InBlock.gif
InBlock.gif                
//光圈

InBlock.gif
                exif += " 光圈:" + pp.GetTagDatum(33437).PrettyPrintValue;
InBlock.gif
InBlock.gif                
//ISO

InBlock.gif
                exif += "  ISO:" + pp.GetTagDatum(34855).PrettyPrintValue;
InBlock.gif
InBlock.gif                
//分辨率

InBlock.gif
                exif += " 分辨率:" +  pp.GetTagDatum(282).PrettyPrintValue + "/" +  pp.GetTagDatum(283).PrettyPrintValue;
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockStart.gif            
catch{}
InBlock.gif
InBlock.gif            
return exif;
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

None.gif

      别忘了最后一步工作,删除forums_PostAttachments表中的Content字段,因为我们不再需要他了。
      完工!     regular_smile.gifcoffee.gif

小试修改ASP.NET Forums

小试修改ASP.NET Forums 修改目标:以前登陆Cookie保存选项只能选择“永久保存”和“不保存”两种情况,要将其修改为可选择“不保存”、“保存一天”、“保存一个月”、“保存一年”四种可选情...
  • delphioo
  • delphioo
  • 2004-08-27 22:51:00
  • 942

ASP.NET Core 2.0系列学习笔记-应用程序修改默认端口支持外网IP访问

ASP.NET Core 2.0 MVC默认端口是:http://localhost:5000/,不支持外网ip访问,此处提供两种修改方式:方式一:代码指定修改;public static IWebH...
  • ChaITSimpleLove
  • ChaITSimpleLove
  • 2018-03-01 17:36:42
  • 121

Asp.net 2.0模块二

  • 2008年07月20日 00:34
  • 1.5MB
  • 下载

关于 Asp.Net Forums 2.4 For .Net Framework 2.0 - Asp.Net Forums (venjiang)

Asp.Net Forums 2.4 是运行于.Net Framework 2.0 平台,基于2.3版本转化. 目前运行不稳定,并且有很多bug.见于很多朋友都在寻求2.0下的版本.现发布出来.此版本...
  • venjiang
  • venjiang
  • 2007-07-30 16:16:00
  • 1394

AspNetForums 2.0 Beta

  • 2004年06月23日 00:00
  • 4.52MB
  • 下载

Asp.Net Forums 修改手记(1)

问题描述:[dbo].[forums_SiteSettings_Get]  没有执行Execute的权限。具体描述:安装了Asp.Net Forums后第一次运行可能会出现这个问题。原因:连接数据库的...
  • moeryang
  • moeryang
  • 2006-04-26 21:53:00
  • 1064

asp.net秘技集锦

  • 2009年11月28日 22:47
  • 1.8MB
  • 下载

asp.net秘笈集锦

  • 2008年11月20日 17:45
  • 1.8MB
  • 下载

ASP.NET 2.0 陈锐老师课程系列二

  • 2009年04月14日 14:59
  • 10.04MB
  • 下载

XAMPP运行MySQL entire log window on the forums解决方案

(此篇为win8环境) 问题出现: 12:19:13 PM [mysql] Error: MySQL shutdown unexpectedly. 12:19:13 PM [mysql] Thi...
  • qq_35411675
  • qq_35411675
  • 2017-08-30 10:04:13
  • 1097
收藏助手
不良信息举报
您举报文章:ASP.NET Forums 2.0 修改集锦(二)
举报原因:
原因补充:

(最多只允许输入30个字)