部署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修改了几下就成了哈哈,欢迎大家来玩。
如果有任何问题请评论或联系我删除!