各位老铁们,是不是每次想给网站加个上传功能就头大?看着别人家的文件上传嗖嗖快,自己写的代码要么传不上去,要么传完找不着?别慌!今天咱们就用小白都能听懂的大白话,把这玩意儿掰开揉碎了讲清楚!
一、上传功能入门三板斧
问题1:上传按钮怎么搞出来?
这事儿简单到你想哭!就两行代码的事儿:
html运行**<form action="/upload" method="post" enctype="multipart/form-data"> <input type="file" name="myFile">form>
这里边三个关键点必须记住:
- enctype="multipart/form-data"(不写这个文件传不上去!)
- method必须是post(get方法传文件等于用吸管喝珍珠奶茶)
- input的type="file"(这才是正经上传按钮)
血泪教训:上周有个小哥漏写enctype,传了三天文件都没成功,差点把键盘砸了!
二、后台接收才是重头戏
问题2:文件传到哪去了?
这就得看后台怎么接了。拿最火的Node.js举例:
javascript**const multer = require('multer');const upload = multer({ dest: 'uploads/' }); //指定存到uploads文件夹app.post('/upload', upload.single('myFile'), (req, res) => { console.log(req.file); //这里能看到文件信息});
注意三个坑:
- 文件夹要提前建好(命令行敲mkdir uploads)
- 记得装multer包(npm install multer)
- upload.single里的名字要和前端input的name一致
真实案例:去年某创业公司把name写成"file",后台用"myFile"接收,白传了2000多张产品图!
三、花式玩法进阶手册
问题3:想传多个文件咋整?
把input加个multiple:
html运行**<input type="file" name="myFiles" multiple>
后台处理要换成array:
javascript**upload.array('myFiles', 5) //最多传5个
参数限制表:
功能 | 前端设置 | 后台设置 |
---|---|---|
文件数量 | multiple | array+数字 |
文件类型 | accept="image/*" | 文件后缀验证 |
文件大小 | 无 | limits:{fileSize: } |
避坑重点:别相信前端限制!后台必须再做一次验证,否则分分钟被人传病毒
四、美化上传按钮的骚操作
问题4:默认按钮太丑了!
教你个瞒天过海的法子:
css**/* 隐藏原生按钮 */input[type="file"] { display: none;}/* 做个假按钮 */.fake-btn { padding: 10px 20px; background: #4CAF50; color: white;}
html运行**<label class="fake-btn"> 点我上传 <input type="file" hidden>label>
效果对比:
- 原生态:灰扑扑的"选择文件"
- 美化后:绿色按钮带点击特效
注意:别忘了加标签关联,否则点了没反应
五、常见翻车现场急救包
问题5:传完文件找不到?
八成是路径问题!检查三处:
- 后台保存路径是不是相对路径(最好用path模块拼接)
- 文件夹读写权限(linux服务器常踩这个坑)
- 文件名有没有特殊字符(中文名容易出乱码)
问题6:图片传完显示不出来?
可能是没设置静态资源目录:
javascript**app.use(express.static('uploads'))
这样就能用http://域名/文件名 访问了
小编私房话
搞了这么多年上传功能,发现新手最爱犯三个错:
- 盲目不核对参数名(十个报错九个是名字对不上)
- 忽略文件类型验证(见过最狠的被人传了10G垃圾文件)
- 忘记删除临时文件(服务器硬盘爆了都不知道为啥)
最近在教实习生,发现个神器——用sharp包自动压缩图片,传图速度直接翻倍。所以说啊,玩转上传功能不在代码多复杂,关键得会找现成的轮子!