部署jf_club项目到Linux上,出现了图片不能正常传的问题。在波总的指导下终于解决,在此记录下。
环境:
centos7
nginx
tomcat8.5
问题:
不能正常上传图片,如图:
后台异常:
解决:
1 目录权限不足,temp没有写入权限?将temp权限提高试试:
chmod 777 temp
此时在此上传,发现文件上传成功了,但是不能正常回显,如图:
(ps:此时我有点脑残了,因为上传成功了,在temp下是有文件的,数据库里也存进去了文件名称,他不能回显是因为没有将图片存到share目录里,此时就应该想到是不是share的权限不足。。。如下为回显路径)
2 最新版本的 tomcat 上传文件以后,文件权限默认是不让读的
到了第二天,波总给我发了消息:
深蓝 12:47:45
、tomcat 最新版上传文件在 linux 的权限问题
tomcat 8 上传文件默认权限变成了 rwx --- --- 需要改成 rwx r-- r--
那么就需要改掉 catalina.sh 中的 UMASK 值为 0133, 如下是片段
if [ -z "$UMASK" ]; then
#UMASK="0027"
# modify by zhanbo, for upload file with rwx r-- r-- right
UMASK="0133"
fi
好的,我们去改下试试:
cd /usr/local/tomcat/bin
首页,听波总的养成好习惯,改配置文件前先备份一份
cp catalina.sh catalina.sh_2018_09_29
然后,vim catalina.sh 果然发现:

按 i 进入编辑模式 将 0027 改为 0311 然后保存退出。
重启tomcat,再次测试,还是不行,波总告诉我删除temp试试,因为上次上传时temp已经是只读的了,删除后再测试发现:
此时发现不能创建temp,因为temp没有时会由club自动生成,于是回到它的顶层目录upload,给高权限:
chmod 777 upload/ -R
然后测试,发现还是不行,提示temp权限不足,如图:
3. 用户 用户组权限问题
此时应该想到tomcat是那个用户启动的,是否具有root权限,用root启动试试:
sudo service tomcat restart
启动后再试发现还是不行,于是ll查看目录发现:

因为前面删除了temp,temp由www新创建的,给temp给个高权限试试:
chmod 777 temp/ -R
此时再次测试发现上传成功了:
总结
至此算是解决了问题,可能是上面三种中一种原因导致,也可能是多种原因混合,总之都是权限的问题。在期间多谢群里的小伙伴和群主的帮助,哈哈编程小白表示解决了问题很开心,同时欢迎大家批评指正。
ps:
项目部署到腾讯云下,无法正常发送邮件,因为腾讯云默认是关闭25端口的,我不想申请解封25端口,于是我就想到用465端口发送
1 先是用了http://www.jfinal.com/project/33 插件,结果没成功。。
2 自己网上搜了一个,换上好了,代码如下:
import java.security.Security;
import java.util.Date;
import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import org.junit.Test;
/**
* javaMail的邮件工具类
* @author wangXgnaw
*
*/
public class sendEmailUtils {
/**
* 使用加密的方式,利用465端口进行传输邮件,开启ssl
* @param to 收件人邮箱
* @param message 发送的消息
*/
public static void sendEmil(String to, String subject,String message) {
try {
Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
//设置邮件会话参数
Properties props = new Properties();
//邮箱的发送服务器地址
props.setProperty("mail.smtp.host", "邮箱服务器");
props.setProperty("mail.smtp.socketFactory.class", SSL_FACTORY);
props.setProperty("mail.smtp.socketFactory.fallback", "false");
//邮箱发送服务器端口,这里设置为465端口
props.setProperty("mail.smtp.port", "465");
props.setProperty("mail.smtp.socketFactory.port", "465");
props.put("mail.smtp.auth", "true");
final String username = "发件人邮箱";
final String password = "发件人密码或授权码";
//获取到邮箱会话,利用匿名内部类的方式,将发送者邮箱用户名和密码授权给jvm
Session session = Session.getDefaultInstance(props, new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
//通过会话,得到一个邮件,用于发送
Message msg = new MimeMessage(session);
//设置发件人
msg.setFrom(new InternetAddress("发件人邮箱"));
//设置收件人,to为收件人,cc为抄送,bcc为密送
msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to, false));
msg.setRecipients(Message.RecipientType.CC, InternetAddress.parse(to, false));
msg.setRecipients(Message.RecipientType.BCC, InternetAddress.parse(to, false));
msg.setSubject(subject);
//设置邮件消息
msg.setText(message);
//设置发送的日期
msg.setSentDate(new Date());
//调用Transport的send方法去发送邮件
Transport.send(msg);
} catch (Exception e) {
e.printStackTrace();
}
}
@Test public void testsend(){
String to ="收件人";
String subject ="主题";
String text ="内容";
sendEmil(to, subject, text);
}
}这个就可以发送很简单的激活和重置密码的邮件了。。
骆驼文学社 用club修改了几下就成了哈哈,欢迎大家来玩。
如果有任何问题请评论或联系我删除!







