前端nginx+Java后台ftp处理页面图片上传踩坑

时间:2023-01-10 06:57:15

今天,将前端代码部署到服务器nginx上,在测试多图片上传时,报错413请求体空间太大,请求都没到后台,直接被nginx拦截,调整后又报错504。

整体而言,前端存在两处问题:

  413 错误 :Request Entity Too Large

  原因是nginx限制了上传文件的大小,在nginx中可以配置最大允许的文件大小:

  打开nginx主配置文件nginx.conf,找到http{},添加

  client_max_body_size 50m;

  504 错误:gateway time out

  原因是后台处理上传文件耗时较长,此处需修改代理对象的请求响应时间,即具体location的配置

  如下:

  proxy_connect_timeout 300s;

  proxy_send_timeout 300s;

  proxy_read_timeout 300s;

  注意:此处单位为秒。

  还没完

  在处理完nginx的相关问题后,调用后台请求发现ftp一直上传不成功,最初是连接超时,其后一直是上传失败。

  连接超时问题

  这里的关键在于,项目部署到了外网服务器,而ftp上传路径为内网ip+port。使用跳板机,配置代理的ip和port即可。

  上传失败问题

  这个问题就比较尴尬了,重新完善日志才将问题最终定位在这一行代码:

    ftpClient.storeFile(filename,local);

  原因较为多元,可能是编码格式问题,也有可能是服务端部署后远程连接端口未配置的问题,

  这里针锋相对的解决如下:

  此处统一编码格式即可

    ftpClient.setControlEncoding("UTF-8");// 设置编码格式    
ftpClient.setFileTransferMode(FTP.STREAM_TRANSFER_MODE);// 设置文件流传输

  端口数据传输问题

    ftpClient.enterLocalPassiveMode();
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);// 设置上传文件的类型为二进制类型

  调用FTPClient.enterLocalPassiveMode();这个方法的意思就是每次数据连接之前,ftp client告诉ftp server开通一个端口来传输数据。为什么要这样做呢,因为ftp server可能每次开启不同的端口来传输数据,但是在linux上,由于安全限制,可能某些端口没有开启,所以就出现阻塞。