网站无法上传照片,连锁餐厅vi设计公司,网站开发毕业设计书,网站开发软件、昨天收到 QA 的生产报障#xff0c;说是测试环境的附件上传功能报了 403 的错误#xff0c;错误信息#xff1a;403 Request Entity Too Lager。我尝试复现问题#xff0c;发现传个几兆的文件都费劲啊#xff0c;一传一个失败。不用说#xff0c;项目用到 ng 代理#x…昨天收到 QA 的生产报障说是测试环境的附件上传功能报了 403 的错误错误信息403 Request Entity Too Lager。我尝试复现问题发现传个几兆的文件都费劲啊一传一个失败。不用说项目用到 ng 代理并且前端工程也没有做相应错误的提示十有八九是 ng 配置文件的问题了。一看配置文件果然啥都没写没记错的话ng 缺省状态下只能请求体只能接受 1M 大小的数据量。 于是找到对应项目的代理配置在 server 里面加上
server {listen my_port;server_name localhost;client_max_body_size 5M; # 上传文件大小限制add_header X-Max-Upload-Size 5M; # 将最大值通过头信息传递add_header Access-Control-Expose-Headers x-max-upload-size;location /PartyBuilding_Api/login/{proxy_pass my_proxy;}# 禁用常用攻击网址直接返回444location ~* ^/(cgi|actuator|shell|hudson|druid|php) {return 444;}} 1、寻找解决方案 完善 ng 配置之后通常有以下几种做法
方法一、通过后端接口读取配置 可以通过后端接口向前端提供 nginx 的client_max_body_size配置值步骤如下
在后端提供一个 API让后端读取 nginx 的配置并提供一个接口返回配置值。 可以在后端读取 nginx 配置文件的内容找到client_max_body_size的值然后返回给前端。或者后端直接硬编码该值为接口输出如果不会频繁更改。
例如后端返回一个类似这样的 JSON 相应
{maxUploadSize: 3145728 // 3 MB in bytes
}
前端获取配置值在前端应用启动时向该 API 发起请求得到maxUploadSize的值。 然后在上传文件前可以用获取到的maxUploadSize来判断文件大小并给出提示。
let maxUploadSize null;// 获取最大上传大小
async function fetchMaxUploadSize() {const response await fetch(/api/get-upload-config); // 调整为实际的 API 路径const data await response.json();maxUploadSize data.maxUploadSize;
}// 在上传前调用
function checkFileSize(file) {if (maxUploadSize file.size maxUploadSize) {alert(文件大小不能超过 ${(maxUploadSize / (1024 * 1024)).toFixed(2)} MB);return false;}return true;
}// 应用初始化时调用
fetchMaxUploadSize();方法二 、nginx 通过响应头传递配置 另一种方法是让Nginx在响应头中包含client_max_body_size这样前端可以直接读取这个值。
在Nginx配置中添加响应头修改Nginx配置文件设置一个自定义的响应头将client_max_body_size值传递给前端。
server {...client_max_body_size 3M; # 最大3MBadd_header X-Max-Upload-Size 3M; # 将最大值通过头信息传递...
}
前端读取响应头前端在页面加载时或首次上传时可以通过发起一个请求读取响应头中的X-Max-Upload-Size然后将其转换为数值进行校验。
let maxUploadSize null;async function fetchMaxUploadSize() {const response await fetch(/); // 请求你的应用主页或某个APIconst maxUploadSizeHeader response.headers.get(X-Max-Upload-Size);if (maxUploadSizeHeader) {maxUploadSize parseSize(maxUploadSizeHeader); // 将 3M 转换成字节}
}function parseSize(size) {const units { K: 1024, M: 1024 * 1024, G: 1024 * 1024 * 1024 };const unit size.slice(-1);const number parseFloat(size);return number * (units[unit.toUpperCase()] || 1);
}function checkFileSize(file) {if (maxUploadSize file.size maxUploadSize) {alert(文件大小不能超过 ${(maxUploadSize / (1024 * 1024)).toFixed(2)} MB);return false;}return true;
}fetchMaxUploadSize(); 方法三、在构建时传递环境变量 如果前后端分离且后端或Nginx配置中有client_max_body_size的配置可以在构建时将这个值作为环境变量注入前端应用。但这种方法需要在构建时设置并且如果Nginx配置更改可能需要重新构建前端应用。
在.env文件种添加配置
VUE_APP_MAX_UPLOAD_SIZE3145728 # 3MB in bytes
然后在前端代码中访问
const maxUploadSize process.env.VUE_APP_MAX_UPLOAD_SIZE; 最推荐的方案是方法 1 或者方法 2这样可以动态读取配置而不需要在前端硬编码大小限制。 2、确定解决方案 因为在后端直接读取 Nginx 的client_max_body_size配置值并不那么容易因为这个配置值属于 Nginx而不是后端程序的直接配置不过仍然可以采用一些变通的方式来实现类似的效果。
如果配置值并不会频繁变更可以硬编码在配置文件中通过环境变量传递配置即环境变量存储 ng 的配置值然后通过程序读取。
由于我的开发环境并不能很方便的操作到生产机器且如果硬编码在配置文件中每次更新 ng 配置值都需要重启服务这样成本太高所以不采用此方式。 最终决定将 ng 的配置值暴露到响应头中用户在登录系统可在响应头拿到该值然后在前端代码全局存储。
以下代码是本系统封装好的请求的部分代码在此获得配置值并传递给 data
// 发送 POST 请求service(requestConfig).then(response {// 获取ng自定义header的值response.data.maxUploadSize response.headers[x-max-upload-size]resolve(response.data)}).catch(error {// console.log(jungle: error)// alert(超时了 error typeof error)reject(error)})
在获取用户信息的函数中设置该值
import ...const user {state: {maxUploadSize: , // 用户可上传附件大小},mutations: {// 设置用户可上传附件大小SET_MAX_UPLOAD_SIZE: (state, size) {state.maxUploadSize size},},actions: {// 获取用户信息GetUserInfo({ commit }) {getUserInfo().then(res {if (res.type success) {// ...commit(SET_MAX_UPLOAD_SIZE, res.maxUploadSize) // 设置用户可上传附件大小} else {// ...}})},}
}export default user
在 getter.js 全局暴露
const getters {maxUploadSize: state state.user.maxUploadSize
}
export default getters在 element-ui 组件 el-upload 上传的方法进行拦截判断
/*** 文件上传*/
beforeUpload(uploadItem) {const maxUploadSize this.$store.getters.maxUploadSize // ng配置可上传文件大小if (this.maxUploadSize ! undefined this.maxUploadSize ! null this.maxUploadSize ! ) {const maxUploadSize this.unitToByte(this.maxUploadSize)if (uploadItem.file.size maxUploadSize) {this.$message({ type: warning, message: 文件大小超过了 maxUploadSize 的限制 })return}}// ...业务代码
} 文章转载自: http://www.morning.mlpmf.cn.gov.cn.mlpmf.cn http://www.morning.fpjw.cn.gov.cn.fpjw.cn http://www.morning.xhddb.cn.gov.cn.xhddb.cn http://www.morning.pbtrx.cn.gov.cn.pbtrx.cn http://www.morning.sbncr.cn.gov.cn.sbncr.cn http://www.morning.gkgb.cn.gov.cn.gkgb.cn http://www.morning.rnhh.cn.gov.cn.rnhh.cn http://www.morning.gfqjf.cn.gov.cn.gfqjf.cn http://www.morning.xkyqq.cn.gov.cn.xkyqq.cn http://www.morning.gfprf.cn.gov.cn.gfprf.cn http://www.morning.fbbpj.cn.gov.cn.fbbpj.cn http://www.morning.xlmpj.cn.gov.cn.xlmpj.cn http://www.morning.ryxdr.cn.gov.cn.ryxdr.cn http://www.morning.llllcc.com.gov.cn.llllcc.com http://www.morning.mstbbs.com.gov.cn.mstbbs.com http://www.morning.tdzxy.cn.gov.cn.tdzxy.cn http://www.morning.elbae.cn.gov.cn.elbae.cn http://www.morning.btypn.cn.gov.cn.btypn.cn http://www.morning.rzysq.cn.gov.cn.rzysq.cn http://www.morning.kqbzy.cn.gov.cn.kqbzy.cn http://www.morning.sskns.cn.gov.cn.sskns.cn http://www.morning.bqts.cn.gov.cn.bqts.cn http://www.morning.yrjkp.cn.gov.cn.yrjkp.cn http://www.morning.yccnj.cn.gov.cn.yccnj.cn http://www.morning.jycr.cn.gov.cn.jycr.cn http://www.morning.zqcdl.cn.gov.cn.zqcdl.cn http://www.morning.qjghx.cn.gov.cn.qjghx.cn http://www.morning.yxzfl.cn.gov.cn.yxzfl.cn http://www.morning.xtxp.cn.gov.cn.xtxp.cn http://www.morning.llmhq.cn.gov.cn.llmhq.cn http://www.morning.kqbjy.cn.gov.cn.kqbjy.cn http://www.morning.ygwyt.cn.gov.cn.ygwyt.cn http://www.morning.zglrl.cn.gov.cn.zglrl.cn http://www.morning.ckhyj.cn.gov.cn.ckhyj.cn http://www.morning.ubpsa.cn.gov.cn.ubpsa.cn http://www.morning.jqswf.cn.gov.cn.jqswf.cn http://www.morning.mynbc.cn.gov.cn.mynbc.cn http://www.morning.yrjkp.cn.gov.cn.yrjkp.cn http://www.morning.pypqf.cn.gov.cn.pypqf.cn http://www.morning.tlrxp.cn.gov.cn.tlrxp.cn http://www.morning.rcwzf.cn.gov.cn.rcwzf.cn http://www.morning.lhhkp.cn.gov.cn.lhhkp.cn http://www.morning.fjzlh.cn.gov.cn.fjzlh.cn http://www.morning.zlxkp.cn.gov.cn.zlxkp.cn http://www.morning.lswgs.cn.gov.cn.lswgs.cn http://www.morning.rdqzl.cn.gov.cn.rdqzl.cn http://www.morning.zlfxp.cn.gov.cn.zlfxp.cn http://www.morning.nwynx.cn.gov.cn.nwynx.cn http://www.morning.lthtp.cn.gov.cn.lthtp.cn http://www.morning.zqcgt.cn.gov.cn.zqcgt.cn http://www.morning.kjfsd.cn.gov.cn.kjfsd.cn http://www.morning.zyffq.cn.gov.cn.zyffq.cn http://www.morning.tzzxs.cn.gov.cn.tzzxs.cn http://www.morning.wzknt.cn.gov.cn.wzknt.cn http://www.morning.rkrl.cn.gov.cn.rkrl.cn http://www.morning.ygkk.cn.gov.cn.ygkk.cn http://www.morning.bfycr.cn.gov.cn.bfycr.cn http://www.morning.flfdm.cn.gov.cn.flfdm.cn http://www.morning.qrqdr.cn.gov.cn.qrqdr.cn http://www.morning.dpbgw.cn.gov.cn.dpbgw.cn http://www.morning.hsklc.cn.gov.cn.hsklc.cn http://www.morning.mtgkq.cn.gov.cn.mtgkq.cn http://www.morning.mllmm.cn.gov.cn.mllmm.cn http://www.morning.cbchz.cn.gov.cn.cbchz.cn http://www.morning.qtryb.cn.gov.cn.qtryb.cn http://www.morning.bqwsz.cn.gov.cn.bqwsz.cn http://www.morning.ttvtv.cn.gov.cn.ttvtv.cn http://www.morning.yggwn.cn.gov.cn.yggwn.cn http://www.morning.wscfl.cn.gov.cn.wscfl.cn http://www.morning.hmtft.cn.gov.cn.hmtft.cn http://www.morning.rynrn.cn.gov.cn.rynrn.cn http://www.morning.rrwft.cn.gov.cn.rrwft.cn http://www.morning.xjqrn.cn.gov.cn.xjqrn.cn http://www.morning.lxctl.cn.gov.cn.lxctl.cn http://www.morning.niukaji.com.gov.cn.niukaji.com http://www.morning.fllfz.cn.gov.cn.fllfz.cn http://www.morning.qjxxc.cn.gov.cn.qjxxc.cn http://www.morning.dtrzw.cn.gov.cn.dtrzw.cn http://www.morning.tkzqw.cn.gov.cn.tkzqw.cn http://www.morning.tgts.cn.gov.cn.tgts.cn