当前位置:首页 > 问答 > 正文

asp怎么上传文件还能存数据库里,简单点教教我吧

上传文件和存入数据库这是两件不同的事儿,得分开做,先想办法把用户电脑上的文件“拿”到你的服务器上,然后再把文件的信息(比如文件名、存放路径等)“存”到数据库里,甚至可以把文件本身变成二进制数据直接存进数据库,但那样比较麻烦,对数据库压力也大,咱们今天主要讲最常用的方法:把文件存到服务器文件夹,然后把文件路径等信息存数据库。

第一步:准备一个上传表单(就是用户传文件的那个页面)

你得有个页面让用户能选择文件,对吧?这个很简单,写个HTML表单就行,但有个超级重要的地方:表单的enctype属性必须设置成 multipart/form-data,不然服务器就接收不到文件数据。

<!-- 这个页面可以叫 upload.html -->
<html>
<body>
<form method="post" action="savefile.asp" enctype="multipart/form-data">
  请选择你要上传的文件:<br>
  <input type="file" name="myfile"><br><br>
  <input type="submit" value="开始上传">
</form>
</body>
</html>

你看,这个表单里有个<input type="file">,这就是让你选择文件的按钮,点“开始上传”后,表单的数据就会发送给savefile.asp这个页面去处理。

第二步:在处理页面里接收并保存文件(核心步骤)

现在轮到重头戏savefile.asp了,在ASP里,我们自己写代码处理上传的文件比较麻烦,幸好有现成的“宝贝”可以用,叫“上传组件”,网上有很多免费的,比如挺出名的一个叫“ASPUpload”(来源:在早期ASP开发中,第三方组件如ASPUpload、LyfUpload被广泛使用以简化文件上传操作),咱们这里就当有这么一个组件可以用,它会把上传的文件和各种信息都帮你整理好。

假设我们已经把这个组件的DLL文件放在服务器上并注册好了(这个步骤可能需要你的服务器管理员帮忙),那么在ASP页面里就可以这样用:

<%
' 创建一个上传组件的对象
Set upl = Server.CreateObject("Persits.Upload.1") ' 这里以Persits.Upload为例
' 设置一下上传文件要保存到服务器的哪个文件夹
' 我在服务器上建了个叫“uploads”的文件夹,它的物理路径可能是 "D:\wwwroot\uploads"
' 但我们在代码里通常用Server.MapPath方法来获取这个路径,这样更灵活
uploadPath = Server.MapPath("/uploads/") ' 这会把虚拟路径“/uploads/”转换成服务器上的物理路径
' 让组件把用户上传的所有东西(包括文件)都“接住”
upl.Save uploadPath
' 文件保存后,我们怎么知道它存成什么名字了呢?
' 组件会提供一个集合(可以理解成一个列表),里面是每个上传的文件的信息
' 因为我们表单里只有一个文件框叫“myfile”,所以我们就取第一个
Set file = upl.Files("myfile")
' file对象里就有这个文件的信息了
if not file is nothing then ' 先判断一下是否真的收到文件了
    ' 文件在服务器上保存后的名字,可能就是原文件名,也可能是组件自动生成的名字
    savedFileName = file.FileName
    ' 文件的原始名字,就是用户电脑上的名字
    originalFileName = file.FileName ' 注意:有些组件用.FileName就是原始名,保存后的名用别的属性,具体看组件文档,这里为简化理解,先这样写。
    ' 文件的大小
    fileSize = file.Size
    ' 这时候,文件已经躺在服务器的“/uploads/”文件夹里了,名字是 savedFileName
end if
' 别忘了,用完对象要释放,这是个好习惯
Set file = nothing
Set upl = nothing
%>

(来源:上述代码结构参考自Persits Upload组件早期版本的使用示例,是处理上传文件的典型流程。)

第三步:把文件信息存到数据库里

文件已经成功保存到服务器文件夹了,现在要把它的“档案”记在数据库里,方便以后查找和使用,假设你有一个Access数据库(.mdb文件)或者SQL Server数据库,里面有一张表,比如叫FileList,有这些字段:ID(自动编号)、FileName(文本,存原始文件名)、FilePath(文本,存在服务器上的路径和文件名)、FileSize(数字)、UploadTime(日期时间)。

我们接着上面的ASP代码写:

<%
' ... 接上面的代码 ...
if not file is nothing then
    ' 获取上面已经得到的文件信息
    originalFileName = file.FileName
    savedFileName = file.FileName ' 同上,假设就是这个
    fileSize = file.Size
    uploadTime = now() ' 获取当前服务器时间作为上传时间
    ' 现在连接数据库
    set conn = Server.CreateObject("ADODB.Connection")
    ' 下面这行是连接字符串,根据你的数据库类型和位置来写
    conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("/database/mydb.mdb") ' 这是Access数据库的例子
    ' 构造一个SQL插入语句,把信息加到数据库里
    sql = "INSERT INTO FileList (FileName, FilePath, FileSize, UploadTime) VALUES ('" & originalFileName & "', '" & savedFileName & "', " & fileSize & ", #" & uploadTime & "#)"
    ' 执行这个SQL语句
    conn.Execute sql)
    ' 关闭数据库连接
    conn.Close
    set conn = nothing
    ' 告诉用户上传成功啦!
    Response.Write "文件上传成功!并已记录到数据库。"
else
    Response.Write "没有收到文件。"
end if
%>

非常重要的一点:安全问题

上面写的数据库插入语句,是为了让你看明白逻辑,但实际上,它有个巨大的安全漏洞,叫做“SQL注入攻击”,如果用户上传的文件名里带有一个单引号,你的SQL语句就会出错,甚至被恶意修改。

绝对不能直接把用户输入的内容(比如originalFileName)拼接到SQL语句里!正确的做法是使用“参数化查询”或者至少对用户输入进行严格的过滤,为了不一开始就让你觉得太复杂,我先告诉你这个风险,你以后一定要去学学怎么防范,简单的话,可以先用Replace函数把文件名里的单引号替换掉: originalFileName = Replace(originalFileName, "'", "''")

总结一下整个流程:

  1. 做个页面(upload.html):用表单,enctype别忘了。
  2. 处理上传(savefile.asp):用上传组件把文件存到服务器指定文件夹。
  3. 记录信息(在savefile.asp里继续):把文件的原始名、服务器上的文件名、大小、上传时间这些信息,用SQL语句INSERT到数据库的表中。

这样,你就完成了文件上传和数据库存储的整个过程,文件实体在服务器的文件夹里,它的“索引”或“档案”在数据库里,以后要管理这些文件,比如显示文件列表、提供下载,你只需要查数据库,找到文件路径,然后读出来就行了。

希望这个直白的解释能帮到你!动手试试吧,遇到具体问题再具体去搜去问。

asp怎么上传文件还能存数据库里,简单点教教我吧