小组Java

Stack Overflow問題地址:http://stackoverflow.com/questions/39355073/spring-mvc-application-upload-image-with-rename-action-in-a-new-user-form

我有一個Spring MVC Hibernate 程序,然後當用戶在瀏覽器輸入localhost:8080/MyApplication/newuser的時候,頁面是顯示一個註冊新用戶的表,表上有姓啊,名啊,用戶名,生日什麼的等等的信息,還有一個能讓用戶上傳照片的按鈕以及讓用戶預覽到上傳後的效果。那麼問題來了,一旦用戶按了上傳照片,用戶之前在表上所填寫的信息都保留著,這可能麼?

第二個問題就是這表會檢測用戶名是否已經被佔用的,當用戶填寫所有有效的信息後,上傳好了照片,我想把照片名稱改為user-{$username}.jpg比如,並且保存在WEB-INF/static/images 文件夾里,這能做到麼?

另外有人在我原post提出不要上傳任何東西在項目的文件夾中,因為一是安全問題,二是re deploy issue…那麼我上述這兩個問題有什麼好的解決方案呢?

謝謝各位了啊

1 收藏


直接登录
最新评论
  • 1.简单的办法,图片用异步上传.返回服务端的存储地址,放到表单中一起提交.

    2.可以改文件名字和移动文件..但是为什么要这样做..很麻烦..

    3.不知道..

    • ★小V★ 程序員 2016/09/09

      那你的意思就是,不需要改名跟轉移位置,只要一開始就設定好上傳到的位置,然後在用戶表里添加一項圖片地址,當用戶上傳完畢後,最後按保存的時候,把圖片地址也添加到表的數據里?

  • KisChang Java 2016/09/09

    user-{$username}.jpg,不建议,如果有用户名为  test/../../../xxx/xxx.xxx?

    替换的最终结果是  user-test/../../../xxx/xxx.xxx?.jpg

    /xxx/xxx.xxx为一个系统目录

    我猜想应该可以访问到

  • 水爱。   2016/09/09

    1楼的回复算是比较简便好用的方法了

  • 疯子船长CasYang 开发工程师 2016/09/09

    问题1:看了楼上的回答,1楼的就是正解了。

    问题2:先稍微反驳下2楼的评论,用户名一般只允许英文数字下划线,出现 / 这种的话,已经不只是文件目录问题,还有SQL注入等安全问题。

    图片保存路径是可以自己定义的,如果不是,那就是你的技术能力不够,多看几篇文章。文件改名可以考虑加上时间戳,这样可以留存用户历史照片,对历史照片做另外的记录(有必要的话)。

    问题3:!!!文件换到非项目目录,很重要!!!

    当然如果你只是自己的项目,做着玩的,那就无所谓。【不然!最好切到非项目目录!】

    讲个真实案例:做的一个项目,在这之前有一次,就因为早期没空做分离,有次重新部署,忘了停止服务器就部署了,导致redeploy(tomcat),清了项目目录下的所有图片!所有!  好在是我们有做同步,图片在另外一台服务器上有备份。 后来就加上了动静分离。

    动静分离可以使用nginx或者其他的一些可用工具,这个可以自己搜索下【动静分离】,我们项目是nginx+tomcat(Java项目)。

    正式的项目里,数据安全很重要,特别是一些丢失就无法找回的数据,备份、分离是其中的一部分方式。

    • 疯子船长CasYang 开发工程师 2016/09/09

      # 补充回复,前面没点stack的地址看。

      看了下stack的问题,发现同样是Java项目,楼主好好看书多查点资料,前面两个问题都是有很多解决方案的了

       

      • ★小V★ 程序員 2016/09/11

        stack那個就是我post上去的….然而在那沒人回答,不過非常感謝你的回答,學習到了

    • KisChang Java 2016/09/10

      啊哦,被反驳了…

      可能你没有理解我的意思,我只是提出了一种关于这样实现可能带来的问题,当然,你从其他方面去限制会减少问题的发生,但不会意味着所有的假设你都能做到提前预防

      例如:如果你没有限制用户名长度呢?linux最大文件名255字符

      我觉得对于新手还是不要告诉他什么是对的,一步一步趟错走过来,更加有利一些吧

      • 疯子船长CasYang 开发工程师 2016/09/10

        抱歉,用词有点不当。也不是说你说的不对,考虑的角度可能不一样。

        用户名这种的已经算是规范了,作为新手,还是应该了解下目前的常规做法,看书看规范,思考为什么大家都这么做,而不是采用其他的做法? 基于常规做法之后,还有没有其他的坑存在?

        在思考的情况下,不理解具体为什么,可以搜索或者提问,如果觉得答案不对或不理解,自己做实际测试,完了也会积累成为自己的知识。模仿是学习的一大入门法则,有了一定的积累,之后碰到其他会出现的坑,就有了分析的基础。

        趟错也是积累的一个方法,不过时间成本太高,如果是生产项目,更是不可能给这样的机会。还有就是,坑太多(这个应该就是你说的所有假设)。但是,不一定有机会碰上所有的坑。如果这次是 / 的问题,下次是中文问题,再下次其他特殊字符或者别的问题呢?

        当然这是每个人学习方法或者接受知识的方式不同,毕竟最基础的就已经有了每个人对看、听、读三种偏重程度的区别了。

    • ★小V★ 程序員 2016/09/13

      有一點我想確認的是,你說的”文件换到非项目目录” 是不是表示不要放在src/main/webapp/static/里?

      • 疯子船长CasYang 开发工程师 2016/09/13

        指的是非项目本身的文件。

        比如你说的用户上传的图片,或者生成的静态页,这些一旦有redeploy(特别是未shutdown的redeploy)就可能被清掉。

        如果是静态页用到的js/css等,可以自己决定。

        如果是项目系统内部的文件,就跟着项目就好了。

        /* 回答仅基于自己的了解,有不同或更好的方案可以一起讨论 */