公司网站后台更新,怎么做网站导航地图,网站线下服务中心建设方案,WordPress数据API文件上传到哪里更好#xff1f; 
上传到服务器本地 上传到服务器本地#xff0c;这种方法在现今商业项目中#xff0c;几乎已经见不到了。因为服务器带宽#xff0c;磁盘 IO 都是非常有限的。将文件上传和读取放在自己服务器上#xff0c;并不是明智的选择。 上传到云储存…文件上传到哪里更好 
上传到服务器本地 上传到服务器本地这种方法在现今商业项目中几乎已经见不到了。因为服务器带宽磁盘 IO 都是非常有限的。将文件上传和读取放在自己服务器上并不是明智的选择。 上传到云储存 上传到云存储则无需担心带宽和磁盘问题而且配置 CDN 也很简单。所以明智的选择要用云存储这里我们以阿里云的对象存储为例来学习如何实现上传。 阿里云对象存储阿里云oss 上传的两种方式 
我们需要开发专门用于阿里云上传的接口。开发上传接口也有两种方案分别是服务端代理上传和客户端直传。这两种方式在开发、使用上各有优劣。我们简单的做个对比 服务端代理上传 服务端代理上传。使用这种方式一张图片先要上传到 Node 项目的服务器中然后再由 Node 服务器上传到阿里云 OSS。 这样这张图片要上传两次会造成网络资源的浪费增加服务器的开销。尤其是在访问量大的情况下会对项目的稳定运行造成很大的影响。 但这种方式也有优点就是开发简单、前端使用非常方便。而且后端可以很方便的做记录可以开发一个专门用来管理用户附件的功能。 1、获取秘钥 
使用代码来访问阿里云需要两个用来认证的参数。点击阿里云网站右上角用户头像里的AccessKey管理 从这里创建自己的阿里云的AccessKey。页面还会弹出使用 RAM 用户 AccessKey。 根据阿里云的提示我们就选择使用 RAM 用户 AccessKey 然后通过验证 
创建完成后还需要对当前用户进行授权。勾选后点击添加权限 关闭小窗口回来看用户信息。这里还有两个非常关键的AccessKey ID和AccessKey Secret。先不要关闭页面马上就要用到它们。 记得保存好 AccessKey Secret 后续无法查看  对当前项进行配置使其可以自由读 无需签名验证 2、配置环境变量 
到这里为止我们开发上传接口所需要的东西已经全部拿到了。打开咱们开发的 Node.js 项目找到.env文件增加点配置。将自己的AccessKey ID和AccessKey Secret值复制进来。 
后面的ALIYUN_BUCKET和ALIYUN_REGION可以在概览中找到我这里分别是wlyxw-oss和oss-cn-chengdu。大家复制的时候注意下只要前面这一部分后面的完整域名不需要。 .env 
NODE_ENVdevelopment
PORT3000
SECRETALIYUN_ACCESS_KEY_IDAccessKey 
ALIYUN_ACCESS_KEY_SECRETAccessKey Secret
ALIYUN_BUCKETwlyxw-oss
ALIYUN_REGIONoss-cn-chengdu 
如果项目是启动状态改完环境变量了记得一定要重启服务。 
3、 安装依赖包 
npm i ali-oss multer multer-aliyun-oss 
ali-oss是用来操作阿里云 OSS 的 SDKmulter是专门用于上传文件的 node.js 中间件multer-aliyun-oss则是用来配合 multer将文件上传到阿里云 OSS 的 
4、实现上传代码 
在/routes目录中新建一个路由文件就叫做uploads.js。 
uploads.js 
const express  require(express);
const router  express.Router();
const { success, failure }  require(../utils/responses);/*** 阿里云 OSS 客户端上传* POST /uploads/aliyun*/
router.post(/aliyun, function (req, res) {try {} catch (error) {failure(res, error);}
})module.exports  router; 接着查看 multer-aliyun-oss的文档。可以看到这里的代码还是比较简单的上面需要先做一个配置然后调用方法就可以上传了。 但这里缺少对上传文件的验证我们继续看 multer的官方文档。看到这里可以通过参数限制文件大小和文件类型。在它们的基础上我们做一个整合就得到了这样一个配置文件。 因为这些配置内容比较多而且将来会在多个不同的路由文件中使用。考虑到代码的干净和复用就不要将它们直接放在路由文件里了。可以在utils里新建一个aliyun.js文件将它们直接粘贴进去。 aliyun.js 
const multer  require(multer);
const MAO  require(multer-aliyun-oss);
const OSS  require(ali-oss);
const {BadRequest}  require(http-errors)// 阿里云配置信息
const config  {region: process.env.ALIYUN_REGION,accessKeyId: process.env.ALIYUN_ACCESS_KEY_ID,accessKeySecret: process.env.ALIYUN_ACCESS_KEY_SECRET,bucket: process.env.ALIYUN_BUCKET,
};const client  new OSS(config);// multer 配置信息
const upload  multer({storage: MAO({config: config,destination: uploads  // 自定义上传目录}),limits: {fileSize: 5 * 1024 * 1024, // 限制上传文件的大小为5MB},fileFilter: function (req, file, cb) {// 只允许上传图片const fileType  file.mimetype.split(/)[0];const isImage  fileType  image;if (!isImage) {return cb(new BadRequest(只允许上传图片。));}cb(null, true);}
});//  单文件上传指定表单字段名为 file
const singleFileUpload  upload.single(file);
// 多文件上传 指定传输字段为files
const multipleFilesUpload  upload.array(files);
module.exports  {config,client,singleFileUpload,multipleFilesUpload
}上面的config都是阿里云相关的配置直接读取刚才定义的环境变量。下面的upload是multer中间件相关的配置我们这里自定义了上传的目录限制了文件大小和类型。接着限定了只允许单文件上传。并指定上传表单的名字叫做file。最后导出它们需要用到singleFileUpload。 接着就要来完善路由实现上传操作了 uploads.js 
const { config, client, singleFileUpload, multipleFilesUpload }  require(../utils/aliyun);
const { BadRequest }  require(http-errors)/*** 阿里云 OSS 客户端上传* POST /uploads/aliyun*/
router.post(/aliyun, function (req, res) {try {singleFileUpload(req, res, async function (error) {if (error) {return failure(res, error);}if (!req.file) {return failure(res, new BadRequest(请选择要上传的文件。));}// 记录附件信息await Attachment.create({...req.file,userId: req.userId,fullpath: req.file.path  /  req.file.filename,})success(res, 上传成功。, {file: req.file.url});});} catch (error) {failure(res, error);}
})// 多文件上传
router.post(/aliyunMultiple, function (req, res) {try {multipleFilesUpload(req, res, async function (error) {if (error) {return failure(res, error);}if (req.files.length  0) {return failure(res, new BadRequest(请选择要上传的文件。));}// 记录附件信息req.files.map(async item  {await Attachment.create({...item,userId: req.userId,fullpath: item.path  /  item.filename,})})success(res, 上传成功。, {files: req.files});});} catch (error) {failure(res, error);}}
) 
顶部引用一下刚才定义的那些上传配置。接着非常简单的调用一下方法如果报错了就提示错误。还要判断下用户是否上传了文件。有的用户可能根本没选文件就直接提交表单了。如果没有出错就显示已经上传的文件信息。文件信息被存储在req.file里了。 
5、app.js添加路由引用 
客户端直传 客户端直传。客户端只需要请求 Node 接口获取上传阿里云所需的授权信息。拿到这些授权信息后再由客户端直接上传到阿里云 OSS。 这样图片不需要经过服务器中转服务器的开销非常小上传速度也会快很多。 对应的缺点就是在开发上代码麻烦点。在使用上前端要调用两次接口操作比较繁琐。 1、生成随机文件 
在开发之前需要先处理点问题。前端去调用接口直接上传文件到阿里云的时候。很有可能多个人上传名字相同的文件。那么大家的文件就会互相覆盖这真是一个大问题必须要先想好怎么处理。 
之前我们在使用multer的时候只要上传文件就会自动生成一个新的文件名。那它是怎么做的呢可以看它里面的源码。 
function getRandomFilename(req, file, cb) {crypto.pseudoRandomBytes(16, function (err, raw) {cb(err, err ? undefined : ${raw.toString(hex)}${Path.extname(file.originalname)});});
} 
可以看到这里用了crypto生成了随机字符。这个包我们在生成自己项目的秘钥的时候也是用的它。这是一种生成随机字符的思路。 
除此外还有种常见的方法要介绍给大家就是UUID。UUID的中文叫做通用唯一识别码。 
在 Node.js 项目中使用它需要先安装一个包名叫就做uuid。查看官方文档只需要简单的引用它调用一下它自带的函数就可以生成唯一的随机字符了 
const { v4: uuidv4 }  require(uuid);
uuidv4(); // ⇨ 1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed 
我们用它生成的这一串可以避免用户上传的文件名相同互相覆盖。直接复制命令安装一下。完成后启动项目。 
npm i uuid进入routes/uploads.js中顶部增加uuid的引用。此外还要引用下moment.js一会儿也会用到它。 
const { v4: uuidv4 }  require(uuid);
const moment  require(moment);上传完整代码 
接着看阿里云直传的官方文档这里直接给了我们示例代码但是里面写的有些乱而且也没有做安全方面的考虑。我们参考它适当整理一下就有了自己的代码。现在来看看实现的代码 
/*** 获取直传阿里云 OSS 授权信息* GET /uploads/aliyun_direct*/
router.get(/aliyun_direct, async function (req, res, next) {// 有效期const date  moment().add(1, days);// 自定义上传目录及文件名const key  uploads/${uuidv4()};// 上传安全策略const policy  {expiration: date.toISOString(),  // 限制有效期conditions:[[content-length-range, 0, 5 * 1024 * 1024], // 限制上传文件的大小为5MB{ bucket: client.options.bucket }, // 限制上传的 bucket[eq, $key, key], // 限制上传的文件名[in, $content-type, [image/jpeg, image/png, image/gif, image/webp]], // 限制文件类型],};// 签名const formData  await client.calculatePostSignature(policy);// bucket 域名阿里云上传地址const host https://${config.bucket}.${(await client.getBucketLocation()).location}.aliyuncs.com.toString();// 返回参数const params  {expire: date.format(YYYY-MM-DD HH:mm:ss),policy: formData.policy,signature: formData.Signature,accessid: formData.OSSAccessKeyId,host,key,url: host  /  key,};success(res, 获取阿里云 OSS 授权信息成功。, params);
}); 
详解 现在要生成上传所需要的授权信息。但是需要给授权信息增加一个有效期总不能无限期使用吧。我这里设置的是 1 天大家可以根据需要自行调整。接着我们定义存储在阿里云 OSS 中的位置是uploads。后面又调用uuid来生成一个唯一的文件名。这样指定好了以后用户就必须按照接口指定的路径和文件名上传。就可以避免文件名相同互相覆盖的问题。下面就是上传的安全策略了分别配置了请求的有效期、文件的大小、指定的存储空间、指定的路径和文件名、必须是图片类型。这里用了eq和in。也就是等于和在范围里的意思。除此外还可以使用starts-with和not-in。具体说明大家可以参考官方文档。配置完成后调用阿里云 SDK 的方法生成签名。再生成一下上传到阿里云要请求的地址。最后将上传所需要的参数全都返回出去就完成了。这里有有效期、上传安全策略、签名、accessid、阿里云 bucket 的域名、上传的路径和文件名。注意下最后的url它是阿里云 bucket 的域名拼接上路径和文件名。组合在一起就是将来上传成功后文件的完整URL地址。 2、使用 Apifox 上传 
到这里接口已经全部开发完成了我们来实际试试上传流程。阿里云上传分为两步 第一步获取阿里云 OOS 授权信息。  第二步使用阿里云 OSS 授权信息上传文件到阿里云 OSS。 2.1. 第一步获取阿里云 OOS 授权信息 Apifox 中新建一个接口  请求方式GET  接口地址/uploads/aliyun_direct  Headers要带上登录成功的token。  
点击发送后就可以获取到授权所需的信息了。  这里获取到的数据挺多的一会儿调用阿里云的接口上传文件这些都会用到的。接着点击后置操作将获取到的值存储到环境变量中这样可以方便后续使用。 
AliyunPolicydata.policyAliyunSignaturedata.signatureAliyunAccessiddata.accessidAliyunKeydata.key  2.2. 第二步上传到阿里云 OSS 第二步前端需要将文件上传到返回的host地址中。我们接着继续调用第二个接口  
接口地址是上一步返回的host 
Body要选择form-data这样才能上传文件。其他所需参数都是上一步返回的已经存入环境变量中的参数大家自行填好即可key{{AliyunKey}}policy{{AliyunPolicy}}OSSAccessKeyId: {{AliyunAccessid}}signature{{AliyunSignature}}file: 要把类型改为fille然后随意选择一个图片。 
点击发送返回状态码204但是没有返回任何提示信息。其实这已经成功了回到阿里云 OSS 里刷新一下可以看到刚上传的文件了。 2.3. 获取图片完整的访问路径 
上传成功后阿里云没有返回给我们任何信息那前端如何获取图片完整的访问路径呢 
其实用第一步生成url就是完整的访问地址。复制这个地址就可以直接用浏览器打开当然也可以放在img标签的src中显示。 
2.4. 错误情况 再来看看上传错误的情况。例如如果不按指定的key来上传自己非要叫做1.jpg 阿里云就会用xml格式提示错误并且返回403状态码。 
如果上传了个zip文件而不是图片也会返回对应的错误提示。  这种错误格式由于用了xml而不是json。将来前端来处理又得费点劲了。 
3. 跨域设置 
还有个问题我们这里是用 Apifox 上传的但是在Vue或者React项目里上传会出现跨域错误。需要在阿里云 OSS 里做个设置 点击跨域设置创建规则 
来源*允许 MethodsPOST允许 Headers* 确定就好这样在前端页面上操作就不会出问题了。 
4. 总结一下 
上传有两种方式。使用直传是效率最高的方式。先调用 Node 接口获取直传所需要的授权参数。前端开发就可以直接将文件上传到阿里云 OSS 了。直传方式一定要在策略中限制好文件的类型、大小、所在路径和文件名。我们这里用uuid生成的唯一文件名并且没有额外加上扩展名。扩展名其实并不是必须的无论有没有都完全不影响img标签显示图片。在网页上直传图片阿里云OSS需要配置跨域。 
5. 额外的尝试 
关于 OSS 还有更多可玩的内容大家可以尝试一下 图片处理在图片路径后加上指定参数可以显示各种处理后的图片例如可以实现裁剪、加水印等操作。  防盗链可以在阿里云 OSS 里设置防盗链这样除了自己的站点可以访问外其他站点引用或者直接访问就无法打开图片了。 还有一种使用策略大家可以试试  私有可以设置成禁止公开访问并设置为私有。  自定义域名然后配置自定义域名并加上SSL证书。  CDN接着开启CDN加速并配置好CDN缓存时间。 配置CDN后阿里云会在全国各地机房都缓存OSS中的文件。让用户访问就近的机房访问速度就会大大的提高。  
因为设置了禁止公开访问用户就必须通过CDN访问。就无法不经过授权通过OSS直接访问图片。大家要知道访问CDN的费用可比直接访问OSS要便宜不少。 文章转载自: http://www.morning.kqyyq.cn.gov.cn.kqyyq.cn http://www.morning.yqhdy.cn.gov.cn.yqhdy.cn http://www.morning.cknsx.cn.gov.cn.cknsx.cn http://www.morning.pnmgr.cn.gov.cn.pnmgr.cn http://www.morning.nkjkh.cn.gov.cn.nkjkh.cn http://www.morning.kgnrh.cn.gov.cn.kgnrh.cn http://www.morning.flfxb.cn.gov.cn.flfxb.cn http://www.morning.gwzfj.cn.gov.cn.gwzfj.cn http://www.morning.guofenmai.cn.gov.cn.guofenmai.cn http://www.morning.tqklh.cn.gov.cn.tqklh.cn http://www.morning.wkpfm.cn.gov.cn.wkpfm.cn http://www.morning.rrxgx.cn.gov.cn.rrxgx.cn http://www.morning.jnhhc.cn.gov.cn.jnhhc.cn http://www.morning.ummpdl.cn.gov.cn.ummpdl.cn http://www.morning.gyjld.cn.gov.cn.gyjld.cn http://www.morning.rqmr.cn.gov.cn.rqmr.cn http://www.morning.rdnjc.cn.gov.cn.rdnjc.cn http://www.morning.mnqg.cn.gov.cn.mnqg.cn http://www.morning.djxnw.cn.gov.cn.djxnw.cn http://www.morning.fkwgk.cn.gov.cn.fkwgk.cn http://www.morning.grpbt.cn.gov.cn.grpbt.cn http://www.morning.lysrt.cn.gov.cn.lysrt.cn http://www.morning.yxnkr.cn.gov.cn.yxnkr.cn http://www.morning.ktqtf.cn.gov.cn.ktqtf.cn http://www.morning.jqbpn.cn.gov.cn.jqbpn.cn http://www.morning.bhjyh.cn.gov.cn.bhjyh.cn http://www.morning.kmjbs.cn.gov.cn.kmjbs.cn http://www.morning.wmfny.cn.gov.cn.wmfny.cn http://www.morning.hyhqd.cn.gov.cn.hyhqd.cn http://www.morning.drywd.cn.gov.cn.drywd.cn http://www.morning.rlbc.cn.gov.cn.rlbc.cn http://www.morning.nhgkm.cn.gov.cn.nhgkm.cn http://www.morning.bby45.cn.gov.cn.bby45.cn http://www.morning.yongkangyiyuan-pfk.com.gov.cn.yongkangyiyuan-pfk.com http://www.morning.nlysd.cn.gov.cn.nlysd.cn http://www.morning.wmfh.cn.gov.cn.wmfh.cn http://www.morning.ffgbq.cn.gov.cn.ffgbq.cn http://www.morning.lfdzr.cn.gov.cn.lfdzr.cn http://www.morning.rgsnk.cn.gov.cn.rgsnk.cn http://www.morning.btcgq.cn.gov.cn.btcgq.cn http://www.morning.dpsyr.cn.gov.cn.dpsyr.cn http://www.morning.sqskm.cn.gov.cn.sqskm.cn http://www.morning.cjxqx.cn.gov.cn.cjxqx.cn http://www.morning.dswtz.cn.gov.cn.dswtz.cn http://www.morning.tslfz.cn.gov.cn.tslfz.cn http://www.morning.zlnkq.cn.gov.cn.zlnkq.cn http://www.morning.rfbq.cn.gov.cn.rfbq.cn http://www.morning.kgltb.cn.gov.cn.kgltb.cn http://www.morning.bndkf.cn.gov.cn.bndkf.cn http://www.morning.rhmk.cn.gov.cn.rhmk.cn http://www.morning.kdldx.cn.gov.cn.kdldx.cn http://www.morning.dfkby.cn.gov.cn.dfkby.cn http://www.morning.wdykx.cn.gov.cn.wdykx.cn http://www.morning.kdrly.cn.gov.cn.kdrly.cn http://www.morning.feites.com.gov.cn.feites.com http://www.morning.rkdzm.cn.gov.cn.rkdzm.cn http://www.morning.wtdyq.cn.gov.cn.wtdyq.cn http://www.morning.xxwl1.com.gov.cn.xxwl1.com http://www.morning.syglx.cn.gov.cn.syglx.cn http://www.morning.gkfwp.cn.gov.cn.gkfwp.cn http://www.morning.pypqf.cn.gov.cn.pypqf.cn http://www.morning.bygyd.cn.gov.cn.bygyd.cn http://www.morning.kkjlz.cn.gov.cn.kkjlz.cn http://www.morning.tjqcfw.cn.gov.cn.tjqcfw.cn http://www.morning.yrck.cn.gov.cn.yrck.cn http://www.morning.pdkht.cn.gov.cn.pdkht.cn http://www.morning.tckxl.cn.gov.cn.tckxl.cn http://www.morning.mmkrd.cn.gov.cn.mmkrd.cn http://www.morning.nqyfm.cn.gov.cn.nqyfm.cn http://www.morning.nlnmy.cn.gov.cn.nlnmy.cn http://www.morning.kbbmj.cn.gov.cn.kbbmj.cn http://www.morning.tknqr.cn.gov.cn.tknqr.cn http://www.morning.yrjxr.cn.gov.cn.yrjxr.cn http://www.morning.kybpj.cn.gov.cn.kybpj.cn http://www.morning.prprz.cn.gov.cn.prprz.cn http://www.morning.swbhq.cn.gov.cn.swbhq.cn http://www.morning.ljbpk.cn.gov.cn.ljbpk.cn http://www.morning.yltyz.cn.gov.cn.yltyz.cn http://www.morning.zfqdt.cn.gov.cn.zfqdt.cn http://www.morning.tgczj.cn.gov.cn.tgczj.cn