tomcat 8 上传文件在 linux 的权限问题

部署jf_club项目到Linux上,出现了图片不能正常传的问题。在波总的指导下终于解决,在此记录下。

    环境:

        centos7

        nginx

        tomcat8.5

    问题:

        不能正常上传图片,如图:

    Cache_4db7ab9bc0467842..jpg

        后台异常:

Cache_26aad687bcc4521d..jpg

   解决:

        1 目录权限不足,temp没有写入权限?将temp权限提高试试:

                chmod 777 temp

                  此时在此上传,发现文件上传成功了,但是不能正常回显,如图:

              Cache_-4b2832b1fbbd115a..jpg

            (ps:此时我有点脑残了,因为上传成功了,在temp下是有文件的,数据库里也存进去了文件名称,他不能回显是因为没有将图片存到share目录里,此时就应该想到是不是share的权限不足。。。如下为回显路径)

image.png

2 最新版本的 tomcat  上传文件以后,文件权限默认是不让读的

          到了第二天,波总给我发了消息:

image.png

         深蓝 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 果然发现:

           image.png

              按 i 进入编辑模式 将 0027 改为 0311 然后保存退出。

              重启tomcat,再次测试,还是不行,波总告诉我删除temp试试,因为上次上传时temp已经是只读的了,删除后再测试发现:

   Cache_19b8facaae98bf85..jpg

            此时发现不能创建temp,因为temp没有时会由club自动生成,于是回到它的顶层目录upload,给高权限:

             chmod 777 upload/ -R

            然后测试,发现还是不行,提示temp权限不足,如图:

image.png

  3. 用户 用户组权限问题

            此时应该想到tomcat是那个用户启动的,是否具有root权限,用root启动试试:

            sudo service tomcat restart

            启动后再试发现还是不行,于是ll查看目录发现:

    image.png

           因为前面删除了temp,temp由www新创建的,给temp给个高权限试试:

           chmod 777 temp/ -R

            此时再次测试发现上传成功了:

   image.png

总结

     至此算是解决了问题,可能是上面三种中一种原因导致,也可能是多种原因混合,总之都是权限的问题。在期间多谢群里的小伙伴和群主的帮助,哈哈编程小白表示解决了问题很开心,同时欢迎大家批评指正。


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修改了几下就成了哈哈,欢迎大家来玩。

如果有任何问题请评论或联系我删除!

评论区

热门分享

扫码入社