原来工程的上传图片存储地址在web应用的目录下,并且是硬编码到其中的:

每次使用maven tomcat:redeploy以后,这个目录就没有了。

现在想要把上传图片的位置移动到tomcat的webapps目录中专门存放图片的一个目录下。

即,新建的一个images目录用来存放web应用的图片们。

这样就把工程和用户上传图片分离了,以后在redeploy时也不用预先备upload目录,然后再拷贝回去,因而在web应该更新时比较方便些。此外,还想改变文件路径被硬编码到java文件中的现状,所以将文件的存储位置预先定义在web.xml中,这样将来再改变位置的时候就不需要再回去改动代码了。

要完成上述目的,需要更新的地方有三个:

一、在web.xml中设置保存上传图片的路径

二、更新与上传图片相关的java类,去掉硬编码的部分,将路径改为从servletContext读取,由web.xml统一配置。

三、更新MySQL数据库中已经存在的数据中的链接路径

下面记录更新的过程:

一、在web.xml中设置保存上传图片的路径

 <context-param>
<param-name>UPLOAD_IMAGE_PATH</param-name>
<param-value>../images/wiqun/upload/</param-value>
</context-param>

二、更新与上传图片相关的java类

上传图片使用的是smartUpload。先通过servletContext获得UPLOAD_IMAGE_PATH参数的地址,保存在image_path这个String变量中。

2.1从servletContext中获得上传文件保存的地址

String image_path = this.getServletContext().getInitParameter("UPLOAD_IMAGE_PATH");//从配置文件中读取要保存的位置

这个地址在使用之前别忘了在代码中测试一下是否存在该目录,若不存在要创建,否则会抛出exception。

2.2使用指定的路径保存上传的图片

 1 su.upload();
2
3 for (int i = 0; i < su.getFiles().getCount(); i++) {
4   com.wiqun.smartUpload.File myfile = su.getFiles().getFile(i);
5     //直接提取或另外生成图片的文件名,保存在fileName变量中
6   ........ 7     //将上传的图片以fileName为名,保存到image_path指定的目录下
8 myfile.saveAs(image_path + fileName); 9   
10 }

第8行中的image_path就是在web.xml文件中指定的UPLOAD_IMAGE_PATH参数的值。

2.3测试

UPLOAD_IMAGE_PATH参数指定的目录下:

三、更新MySQL数据库中已经存在的测试数据中的链接路径

数据库中存有曾经的测试数据,其中的图片路径还是"upload/xxxxxx.jpg"格式的。现在要把它们替换成我们在web.xml中定义的新路径"../images/wiqun/upload/xxxxx.jpg"格式。此过程可以使用MySQL的replace语句来完成。现在,我们要把sight表格中的introduction列中的“upload/”替换成“../images/wiqun/upload/”,语句为:

update sight set introduction = replace(introduction,'upload/','../images/wiqun/upload/');

格式为 update 表名 set 列名 = replace(列名,'被替换的字串','替换的字串')

执行前,数据库introduction列部分截图如下:

wiqun是web应用的名称。当前所有用户上传的图片都是存放在wiqun目录的upload目录下,就像文章一开始所显示的截图。

在执行了上述replace语句后,MySQL提示如下:

现在再看看数据库里的状态:

可以看到路径名都已经完成替换了。
在浏览器中测试图片是否可以浏览:

至此,就完成了web应用中,上传文件的路径替换。

以后如果还要更改路径,只需要更改web.xml中UPLOAD_IMAGE_PATH参数的值,并且更新数据库中的链接即可,不需要再改动代码了。硬编码真是有些伤不起。不知道数据库中是不是也可以预先定义一个变量什么的,然后也直接绑定到配置文件中,这样以后也不需要手工更新数据库了。

至于别的大神说用云存储的方式进行存储,小编在此还不会,哪位大神要会的话进行个留言,万分感谢!

java web应用用户上传图片的存储地址的更多相关文章

  1. java web课程设计截图和服务器地址

    企业办公测试截图和服务器地址 本篇博客主要围绕以下几个部分展开,登录.系统管理.工作流.个人事务管理.内部邮件.公共信息共六个部分.主要有界面截图和简要介绍. 一.登录.更改密码界面 登录界面包括以管 ...

  2. Java Web实现用户登录界面

    一.学习Java Web需要的技术: Java语言基础:算法基础.常用数据结构.编程规范. 掌握常见的数据结构和实用算法:培养良好的编程习惯. Java面向对象:封装.继承.多态等,面向对象程序设计, ...

  3. Java Web实现用户登录功能

    java web 学习记录一下 mvc结构实现mysql 连接 什么是mvc MVC是模型(model).视图(view).控制(controller)这三个单词上的首字母组成.它是一种应用模型,它的 ...

  4. Java Web(九) 用户管理系统

    前面学习了一大堆,什么JSP,Servlet.jstl.el等等等,大多是一些死的东西,只要会其语法,知道怎么用就行了,所以做了一个小小的只有增删改查的小demo,为的就是熟悉这些知识.灵活运用起来. ...

  5. Java使用阿里云OSS对象存储上传图片

    原 Java使用阿里云OSS对象存储上传图片 2017年03月27日 10:47:28 陌上桑花开花 阅读数 26804更多 分类专栏: 工作案例总结 版权声明:本文为博主原创文章,遵循CC 4.0 ...

  6. Java Web开发 - 持久型/存储型XSS漏洞

    Java Web开发 - 持久型/存储型XSS漏洞 1.什么是XSS漏洞攻击? XSS是跨站脚本攻击(Cross Site Scripting)的简称,之所以叫XSS而不是CSS相比大家都能明白了吧, ...

  7. Java Web 开发利用Struts2+Spring+mybatis写一个用户登录界面以及简单的数据交互

    框架的东西太复杂也难以讲通,直接上代码: 一.首先得配置环境 和导入必要的jar包 有一些重要的如下: Filter文件夹下的SafetyFilter.java   model文件夹下的 Global ...

  8. java web用户登录界面

    做这次实验,主要用到了mysql  java web 的 内容 实验代码: IUserDao.java package com.jaovo.msg.dao; import java.util.List ...

  9. 如何在java web工程下建立存储property文件的文件夹,让Java程序直接读取

    如何在java web工程下建立存储property文件的文件夹,让Java程序直接读取: 步骤如下:

随机推荐

  1. LINUX搭建网站环境教程

    安装Mysql yum install mysql-server -y 启动Mysql service mysqld restart 此实验使用 mysql 默认账户名和密码,您也可以设置自己的 My ...

  2. LeetCode Array Easy 122. Best Time to Buy and Sell Stock II

    Description Say you have an array for which the ith element is the price of a given stock on day i. ...

  3. spring3+structs2整合hibernate4时报org.springframework.beans.factory.BeanCreationException: Could not autowire method: public void sy.dao.impl.UserDaoImpl.setSessionFactory(org.hibernate.SessionFactory);

    今天在spring3+structs2整合hibernate4时报如下错误,一直找不到原因: org.springframework.beans.factory.BeanCreationExcepti ...

  4. tail - 输出文件的末尾部分

    SYNOPSIS(总览) ../src/tail [OPTION]... [FILE]... DESCRIPTION(描述) 在标准输出上显示每个FILE的最后10行. 如果多于一个FILE,会一个接 ...

  5. [转] datetime.now、datetime.utcnow以及Django中的timezone.now之间的区别

      https://blog.csdn.net/sinat_41898105/article/details/80984298   在我们使用Django做项目时经常会遇到时间的存储与读取不一致的问题 ...

  6. 聚合函数 -AVG/MAX/MIN/STDDEV/VARIANCE/SUM/COUNT/MEDIAN

    ------------------------------------------聚合函数--------------------------------------------- --1: AVG ...

  7. volatile(防止编译器对代码进行优化)

    adj.易变的:无定性的:无常性的:可能急剧波动的 网络挥发性:挥发性的:不稳定的 volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了.

  8. nodejs模块——fs模块 读取文件

    readFile读取文件 fs.readFile(filename,[option],callback) 方法读取文件. 参数说明: filename String 文件名 option Object ...

  9. 埃氏筛+线段树——cf731F

    从2e5-1依次枚举每个数作为主显卡,然后分段求比它大的数的个数,这里的复杂度是调和级数ln2e5,即埃氏筛的复杂度.. #include<bits/stdc++.h> using nam ...

  10. STM32嵌入式开发学习笔记(三):使用按键控制小灯

    按键和小灯一样,也是通过GPIO外设与主板连接,也是通过GPIO_InitStruct类型结构体控制其工作. 查阅技术手册,按钮连接GPIOA控制下的管脚0. 但与之不同的是,按键是一种输入设备,输入 ...