现在碰到一个难题,我的代码并不能符合我自己的要求,如下:
boolean isLegal = true;
String[] letters = new String[] { "/", "\\", ":", "*", "?", "\"", "<",
">", "|" };
for (int i = 0; i < letters.length; i++) {
if (filFilePath.indexOf(letters[i]) != -1) {
isLegal = false;
break;
}
}
if (!isLegal) {
//msg.setCode("AP_GBC007_3");
//container.setJspErrMsg(msg);
return false;
}
我解释一下,letters数组中定义的字符都是windows里不允许在文件名中出现的,
可是如果filFilePath="c:/1.jpg"原则上是合法的,但我的方法却把它认作非法的,请问,如何改进我的方法呢?注意:千万不能用java.io.File类的isFile方法,这个方法只能判断服务器上是否有这个文件,并且文件名是否合法
而不能判断客户端浏览器那传过来的filFilePath是否合法。

解决方案 »

  1.   

    当然会认为非法的 
    你的数组里 有"/"字符不是么?
    你的参数 也有这个"/"
    if (filFilePath.indexOf(letters[i]) != -1) { 
    isLegal = false; 
    break; 
    } 已经false  break了
      

  2.   

    这个有难度啊
    c:/1/2/33.2/4en.jpg
    不晓得33.2/4en.jpg是一起的还是33.2目录下面的4en.jpg文件
      

  3.   

    import java.util.regex.Matcher;
    import java.util.regex.Pattern;public class Test01 {
        public static void main(String[] args) {
            String str = "c:/program file/a\\1.jpg";
            String regex = "[a-zA-Z]:(?:[/\\\\][^/\\\\:*?\"<>|]{1,255})+";
            Pattern pattern = Pattern.compile(regex);
            Matcher matcher = pattern.matcher(str);
            System.out.println(matcher.matches());
        }
    }
      

  4.   

    你追加一个判断啊,if(path.indexOf("/")!=-1 && path.indexOf("\\")==-1){
      这样好像也是合法的,
    }
      

  5.   

    没太看明白楼主的意思
    filFilePath="c:\/1.jpg"这样加"\"不知道是否能解决楼主的问题
    我记得":"好像不影响,楼主可以自己试一下
    JAVA中如果需要把一些符号写进字符串还想保证符号有意义的话,可以再符号前面加"\"
    也不知道说的对不对,请不清楚.希望对LZ有用
      

  6.   

    这个好像是正确答案,虽然我看过一些正则,但只是停留在很基础的地步,
    [a-zA-Z]:这个我看懂了,剩下的乱七八糟的字符是什么意思啊?能否稍微
    点拨一下呢
      

  7.   

    我是记不住的,估计不常用的人都记不住,去翻API哈
      

  8.   

    这个好像是正确答案,虽然我看过一些正则,但只是停留在很基础的地步, 
    [a-zA-Z]:这个我看懂了,剩下的乱七八糟的字符是什么意思啊?能否稍微 
    点拨一下呢
      

  9.   

    我自己亲自试了下c:/1.jpg返回true
    c:/1/.jpg返回true,应该返回false
    c:\1.jpg返回false,应该返回true能否再改进下?
      

  10.   

    正则表达式http://www.unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#mission 如果打不开的话google一下就可以看到了
      

  11.   


    c:/1/.jpg  .jpg 是合法的文件名
    c:\1.jpg   你在 JAVA 字符串中应该写为 "c:\\1.jpg"如果要让 .jpg 成为非法的文件名,改成这样就可以了。import java.util.regex.Matcher;
    import java.util.regex.Pattern;public class Test01 {
        public static void main(String[] args) {
            String[] strs = {
                    "c:\\.jpg",
                    "c:/.jpg",
                    "c:/1/1.jpg",
                    "c:\\1.jpg"
                };
            String regex = "[a-zA-Z]:(?:[/\\\\][^/\\\\:*?\"<>|.][^/\\\\:*?\"<>|]{0,254})+";
            Pattern pattern = Pattern.compile(regex);
            Matcher matcher = pattern.matcher("");
            for(int i = 0; i < strs.length; i++) {
                System.out.println(strs[i] + "  " + matcher.reset(strs[i]).matches());
            }
        }
    }
      

  12.   

    正则表达式的资源:http://topic.csdn.net/u/20080306/17/f37a1818-3968-49b4-8f79-e5564486d63e.html
      

  13.   

    我觉得可以先把 filepath 过滤一下,比如先把 C:\dsadas.jsp 过滤成 dsadas.jsp ,把dsadas.jsp这个字符串重新赋给一个 string A,再if (A.indexOf(letters[i]) != -1) 判断就好了吧
    过滤很简单的,用  stringbuffer 的StringTokenizer就可以了