- 修改数据库:为
dede_sysdiy表(存储自定义表单数据的表)添加一个附件字段。 - 修改模板:在自定义表单的模板文件中,添加一个文件上传的HTML输入框。
- 处理并显示附件:修改处理表单提交的PHP文件,使其能够接收、保存附件信息,并修改列表页和内容页模板来正确显示附件。
第一步:修改数据库,添加附件字段
这是最基础也是最关键的一步,我们需要告诉数据库,我们的表单需要存储一个文件信息。

-
登录你的网站后台(
www.yourdomain.com/dede/)。 -
进入【系统】-> SQL命令行工具。
-
在文本框中输入以下SQL语句,然后点击“查询”执行。
ALTER TABLE `dede_sysdiy` ADD `fileurl` VARCHAR(255) NOT NULL DEFAULT '';
语句解释:
(图片来源网络,侵删)ALTER TABLE 'dede_sysdiy':表示要修改dede_sysdiy这张表,这张表存储了所有自定义表单提交的数据。ADD 'fileurl' VARCHAR(255) NOT NULL DEFAULT '':表示要添加一个名为fileurl的新字段。fileurl:字段名,我们约定俗成用这个名字。VARCHAR(255):字段类型,用于存储文件的路径,255个字符长度足够。NOT NULL DEFAULT '':表示这个字段不能为空,默认值为空字符串。
执行成功后,你的dede_sysdiy表就多了一个可以存储附件地址的列。
第二步:修改自定义表单模板,添加上传框
我们要在前端让用户能够看到并使用文件上传功能。
-
进入自定义表单管理:在后台,找到【核心】-> 内容模型管理 -> 自定义表单。
-
编辑你的表单:找到你想要添加附件功能的那个自定义表单,点击后面的【修改】按钮。
(图片来源网络,侵删) -
修改模板:在表单编辑页面,你会看到一个“模板内容”的文本框,这里就是用户填写表单时看到的HTML代码。
-
在合适的位置(比如其他输入框的后面)添加以下HTML代码:
<p> <label>附件上传:</label> <input type="file" name="fileatt" id="fileatt" class="intxt" style="width:250px" /> <span style="color:#F00;">* 请上传您的简历或相关作品</span> </p>代码解释:
<p>:一个段落标签,用于布局。<label>:标签,for属性关联到input的id,点击文字可以选中文件框。<input type="file" ...>:这是核心的文件上传输入框。name="fileatt":非常重要! 这个name属性值是我们稍后在PHP代码中用来接收文件的关键,我们这里用fileatt作为标识。id="fileatt":与label的for属性对应。class="intxt":为了保持与DedeCMS默认样式一致,可以加上这个类。
<span>:用于添加一些提示文字。
-
保存:点击页面底部的【保存】按钮。
你可以去前台刷新你的自定义表单页面,应该能看到新添加的“附件上传”选项了,此时提交了也只会保存文件名到数据库,而文件本身并没有被保存到服务器上。
第三步:处理附件并显示
最后一步,也是最复杂的一步,需要修改PHP文件来处理文件上传逻辑,并修改列表和内容页模板来显示附件。
1 修改处理文件(diy.php)
这个文件负责接收表单数据并将其存入数据库,我们需要在这里加入文件上传、保存和路径记录的逻辑。
-
找到文件:在你的网站根目录下,找到
plus/diy.php文件。 -
备份:在修改之前,务必备份这个原始文件!
-
修改代码:打开
diy.php文件,找到处理表单数据的代码段(通常在文件末尾,if($do == 2)里面),我们需要在$diy->save($addvar);这行代码之前,插入处理附件的代码。在
$diy->save($addvar);之前,添加如下代码:// 处理附件上传 if(!empty($_FILES['fileatt']['name'])) { $upload = new Upload(); $upload->setRootPath($cfg_basedir); $upload->setSubDir('uploads/diyfile'); // 设置附件上传的子目录,可以自定义,如 'uploads/resume' $fileinfos = $upload->uploadOne('fileatt'); if($fileinfos) { $addvar['fileurl'] = $fileinfos['url']; // 将上传后的文件路径存入 $addvar 数组,键名 'fileurl' 要与数据库字段名一致 } else { ShowMsg('附件上传失败:' . $upload->getErrorMsg(), '-1'); exit(); } }代码解释:
if(!empty($_FILES['fileatt']['name'])):判断是否有名为fileatt的文件被上传,这里的fileatt要和第二步中<input>的name属性一致。$upload = new Upload();:实例化DedeCMS自带的上传类。$upload->setRootPath($cfg_basedir);:设置上传的根目录为网站根目录。$upload->setSubDir('uploads/diyfile');:强烈建议设置一个专门的子目录来存放这些附件,避免和网站其他文件混淆,你可以改成你喜欢的名字,比如uploads/resume。$fileinfos = $upload->uploadOne('fileatt');:执行上传,并返回文件信息。if($fileinfos):如果上传成功。$addvar['fileurl'] = $fileinfos['url'];:最关键的一步,将上传成功后得到的文件相对路径(如/uploads/diyfile/yourfile.pdf)赋值给$addvar数组中键为fileurl的元素,这个键名fileurl必须和我们在第一步中创建的数据库字段名完全一致。else:如果上传失败,则显示错误信息并终止。
-
保存:保存修改后的
diy.php文件。
当用户提交表单时,文件就会被上传到 /uploads/diyfile/ 目录下,并且文件路径会被保存到数据库的 fileurl 字段中。
2 修改列表页模板(list_diyform.htm)
这个模板用于显示所有提交记录的列表。
-
找到文件:在后台,【模板】-> 自定义表单模板,找到你的表单对应的列表模板(通常命名为
list_diyform.htm)。 -
修改代码:在循环显示每一条记录的地方(通常是
{dede:list}或{volist}标签内),添加显示附件的链接。<tr> <td>{field:username/}</td> <!-- 假设有一个用户名字段 --> <td>{field:fileurl/}</td> <!-- 新增:显示附件路径,但这只是路径,不是链接 --> </tr>为了让附件可以下载,我们需要使用
[field:fileurl function='GetDownload(@me)'/]来处理。修改后的正确写法:
<tr> <td>{field:username/}</td> <td> {if field:fileurl runphp='yes'} @me = "<a href='".@me."' target='_blank'>点击下载附件</a>"; {else} @me = "未上传附件"; {/if} </td> </tr>或者更简洁的写法:
<tr> <td>{field:username/}</td> <td> {if field:fileurl} <a href="[field:fileurl/]" target="_blank">点击下载附件</a> {else} 未上传附件 {/if} </td> </tr>代码解释:
{if field:fileurl}:判断fileurl字段是否有值。<a href="[field:fileurl/]" target="_blank">...</a>:如果值存在,则生成一个下载链接。[field:fileurl/]会直接输出数据库中存储的文件路径。target="_blank":建议加上,点击链接会在新页面打开,通常是下载页面。{else} ... {/if}:如果没有值,则显示“未上传附件”。
-
保存:保存模板文件。
3 修改内容页模板(diy_field.htm)
这个模板用于显示单条记录的详细信息。
-
找到文件:在后台,【模板】-> 自定义表单模板,找到你的表单对应的内容页模板(通常命名为
diy_field.htm)。 -
修改代码:在合适的位置,添加显示附件的链接,逻辑和列表页类似。
<div class="form-detail"> <p><strong>姓名:</strong>{field:username/}</p> <p><strong>联系电话:</strong>{field:tel/}</p> <!-- 新增:附件显示部分 --> <p><strong>附件:</strong> {if field:fileurl} <a href="[field:fileurl/]" target="_blank">点击下载附件</a> {else} 未上传附件 {/if} </p> </div> -
保存:保存模板文件。
总结与注意事项
- 核对字段名:确保数据库字段名、
$addvar数组键名、模板中[field:xxx/]的xxx都完全一致,我们这里统一使用fileurl。 - 核对
name属性:确保HTML中<input type="file" name="...">的name值,与diy.php中$_FILES['...']的键名一致,我们这里使用fileatt。 - 目录权限:确保你设置的附件上传目录(如
/uploads/diyfile/)存在并且有写入权限(权限值通常为755或777)。 - 安全考虑:此方法直接将文件路径存入数据库并显示,对于公开的表单(如访客留言)存在一定安全隐患,建议在生产环境中增加文件类型、大小限制,并对上传的文件进行重命名或安全扫描。
- 测试:每完成一步,都去前台进行测试,确保功能正常,先测试上传,再测试提交,最后测试列表和内容页的显示。
通过以上三个步骤,你就可以成功地为DedeCMS自定义表单添加一个功能完整的附件上传和下载功能了。
