nginx 搭建图片服务器《四》:后台java代码springMVC+spring实现图片上传


本文使用java代码实现图片远程上传到linux的图片服务器上。

前提:linux安装好了ftp模块,nginx服务器,搭建好了图片服务器,可以远程访问

 

搭建图片服务器《一》-linux安装ftp组件

 

 

搭建图片服务器《二》-linux安装nginx

搭建图片服务器《三》:linux上nginx+ftp搭建图片服务器

 

 

 

一个需求

通过springMVC接受图片文件然后上传到图片服务器,把图片在图片服务器上的相对路径(不包括图片服务器的ip,防止图片服务器ip改变)保存在数据库中

实现环境:前台上传图片组件+springMVC+spring+mybatis+mysql

 

引入依赖

需要导入相关jar包,这里使用maven管理,导入依赖:

 

[sql]  view plain  copy
 
  1. <!-- 加入上传文件组件 -->  
  2. <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->  
  3. <dependency>  
  4.   <groupId>commons-io</groupId>  
  5.   <artifactId>commons-io</artifactId>  
  6.   <version>2.1</version>  
  7. </dependency>  
  8. <!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->  
  9. <dependency>  
  10.   <groupId>commons-fileupload</groupId>  
  11.   <artifactId>commons-fileupload</artifactId>  
  12.   <version>1.3</version>  
  13. </dependency>  
  14.   
  15. <!-- https://mvnrepository.com/artifact/commons-net/commons-net -->  
  16. <dependency>  
  17.   <groupId>commons-net</groupId>  
  18.   <artifactId>commons-net</artifactId>  
  19.   <version>3.3</version>  
  20. </dependency>  

 

 

 

由于上传文件需要图片服务器相关的配置信息,这里为了不硬编码在代码中,模仿数据库连接信息的方式配置在配置文件中,然后交给spring进行管理

图片服务器需要的配置的配置文件放在classpath下:

ftp.properties

 

[plain]  view plain  copy
 
  1. #ftp相关配置    
  2. FTP_ADDRESS=192.168.1.113  
  3. FTP_PORT=21  
  4. FTP_USERNAME=ftpuser_album  
  5. FTP_PASSWORD=123456  
  6. FTP_BASEPATH=/home/ftpuser_album/www/album_images  
  7. #图片服务器相关配置   
  8. IMAGE_BASE_URL=http://192.168.1.113/album_images  

 

配置文件内容让spring读取到容器中,然后存储在实体类中:

spring配置

 

[java]  view plain  copy
 
  1. <!-- 加载多个配置文件 -->  
  2. <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  
  3.     <property name="locations">  
  4.         <list>  
  5.             <value>classpath:db.properties</value>  
  6.             <value>classpath:ftp.properties</value>  
  7.             <value>classpath:redis.properties</value>  
  8.         </list>  
  9.     </property>  
  10. </bean>  

 

springMVC配置文件需要配置上传文件的bean

 

[java]  view plain  copy
 
  1. <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">  
  2.     <property name="defaultEncoding" value="utf-8"></property>  
  3.     <property name="maxUploadSize" value="10485760000"></property>  
  4.     <property name="maxInMemorySize" value="40960"></property>  
  5. </bean>  



 

 

实体类:FtpConfig.java

 

[java]  view plain  copy
 
  1. @Component  
  2. public class FtpConfig {  
  3.       
  4.     /** 
  5.      * 获取ip地址   
  6.      */  
  7.     @Value("${FTP_ADDRESS}")  
  8.     private String FTP_ADDRESS;   
  9.       
  10.     /** 
  11.      * 端口号   
  12.      */  
  13.     @Value("${FTP_PORT}")  
  14.     private String FTP_PORT;   
  15.       
  16.     /** 
  17.      * 用户名   
  18.      */  
  19.     @Value("${FTP_USERNAME}")  
  20.     private String FTP_USERNAME;   
  21.       
  22.     /** 
  23.      * 密码   
  24.      */  
  25.     @Value("${FTP_PASSWORD}")  
  26.     private String FTP_PASSWORD;    
  27.       
  28.     /**基本路径   
  29.      */  
  30.     @Value("${FTP_BASEPATH}")  
  31.     private String FTP_BASEPATH;    
  32.       
  33.     /** 
  34.      * 下载地址地基础url   
  35.      */  
  36.     @Value("${IMAGE_BASE_URL}")  
  37.     private String IMAGE_BASE_URL;  
  38.   
  39. ...set和get方法就省略  
  40. }  

 

这样哪里需要使用图片服务器配置信息就可以通过@AutoWired注入FtpConfig对象即可

 

上传案例

上传的工具类:

 

[java]  view plain  copy
 
  1. public class FtpUtil {  
  2.   
  3.     /** 
  4.      * ftp上传图片方法 
  5.      *title:pictureUpload 
  6.      *@param ftpConfig  由spring管理的FtpConfig配置,在调用本方法时,可以在使用此方法的类中通过@AutoWared注入该属性。由于本方法是静态方法,所以不能在此注入该属性 
  7.      *@param picNewName 图片新名称--防止重名 例如:"1.jpg" 
  8.      *@param picSavePath 图片保存路径。注:最后访问路径是 ftpConfig.getFTP_ADDRESS()+"/images"+picSavePath 
  9.      *@param file 要上传的文件(图片) 
  10.      *@return 若上传成功,返回图片的访问路径,若上传失败,返回null 
  11.      * @throws IOException 
  12.      */  
  13.     public static String pictureUploadByConfig(FtpConfig ftpConfig,String picNewName,String picSavePath,InputStream inputStream) throws IOException{  
  14.   
  15.         String picHttpPath = null;  
  16.   
  17.   
  18.         boolean flag = uploadFile(ftpConfig.getFTP_ADDRESS(), ftpConfig.getFTP_PORT(), ftpConfig.getFTP_USERNAME(),  
  19.                 ftpConfig.getFTP_PASSWORD(), ftpConfig.getFTP_BASEPATH(), picSavePath, picNewName, inputStream);  
  20.   
  21.         if(!flag){  
  22.             return picHttpPath;  
  23.         }  
  24.   
  25.         //picHttpPath = ftpConfig.getFTP_ADDRESS()+"/images"+picSavePath+"/"+picNewName;  
  26.         picHttpPath = ftpConfig.getIMAGE_BASE_URL()+picSavePath+"/"+picNewName;  
  27.         System.out.println("==="+picHttpPath);  
  28.         return picHttpPath;  
  29.     }  
  30.       
  31.       
  32.       
  33.       
  34.     /**   
  35.      * Description: 向FTP服务器上传文件   
  36.      * @param host FTP服务器hostname   
  37.      * @param port FTP服务器端口   
  38.      * @param username FTP登录账号   
  39.      * @param password FTP登录密码   
  40.      * @param basePath FTP服务器基础目录  
  41.      * @param filePath FTP服务器文件存放路径。例如分日期存放:/2015/01/01。文件的路径为basePath+filePath  
  42.      * @param filename 上传到FTP服务器上的文件名   
  43.      * @param input 输入流   
  44.      * @return 成功返回true,否则返回false   
  45.      */      
  46.     public static boolean uploadFile(String host, String ftpPort, String username, String password, String basePath,    
  47.             String filePath, String filename, InputStream input) {  
  48.         int port = Integer.parseInt(ftpPort);  
  49.         boolean result = false;    
  50.         FTPClient ftp = new FTPClient();    
  51.         try {    
  52.             int reply;    
  53.             ftp.connect(host, port);// 连接FTP服务器    
  54.             // 如果采用默认端口,可以使用ftp.connect(host)的方式直接连接FTP服务器    
  55.             ftp.login(username, password);// 登录    
  56.             reply = ftp.getReplyCode();    
  57.             if (!FTPReply.isPositiveCompletion(reply)) {    
  58.                 ftp.disconnect();    
  59.                 return result;    
  60.             }    
  61.             //切换到上传目录    
  62.             if (!ftp.changeWorkingDirectory(basePath+filePath)) {    
  63.                 //如果目录不存在创建目录    
  64.                 String[] dirs = filePath.split("/");    
  65.                 String tempPath = basePath;    
  66.                 for (String dir : dirs) {    
  67.                     if (null == dir || "".equals(dir)) continue;    
  68.                     tempPath += "/" + dir;    
  69.                     if (!ftp.changeWorkingDirectory(tempPath)) {    
  70.                         if (!ftp.makeDirectory(tempPath)) {    
  71.                             return result;    
  72.                         } else {    
  73.                             ftp.changeWorkingDirectory(tempPath);    
  74.                         }    
  75.                     }    
  76.                 }    
  77.             }    
  78.             //设置上传文件的类型为二进制类型   
  79.             ftp.setFileType(FTP.BINARY_FILE_TYPE);  
  80.             ftp.enterLocalPassiveMode();//这个设置允许被动连接--访问远程ftp时需要  
  81.             //上传文件    
  82.             if (!ftp.storeFile(filename, input)) {    
  83.                 return result;    
  84.             }    
  85.             input.close();    
  86.             ftp.logout();    
  87.             result = true;    
  88.         } catch (IOException e) {    
  89.             e.printStackTrace();    
  90.         } finally {    
  91.             if (ftp.isConnected()) {    
  92.                 try {    
  93.                     ftp.disconnect();    
  94.                 } catch (IOException ioe) {    
  95.                 }    
  96.             }    
  97.         }    
  98.         return result;    
  99.     }    
  100.         
  101.       
  102.       
  103.     //下载文件方法不用看,可能日后有用,先留在这里==========================================  
  104.       
  105.       
  106.     /**   
  107.      * Description: 从FTP服务器下载文件   
  108.      * @param host FTP服务器hostname   
  109.      * @param port FTP服务器端口   
  110.      * @param username FTP登录账号   
  111.      * @param password FTP登录密码   
  112.      * @param remotePath FTP服务器上的相对路径   
  113.      * @param fileName 要下载的文件名   
  114.      * @param localPath 下载后保存到本地的路径   
  115.      * @return   
  116.      */      
  117.     public static boolean downloadFile(String host, int port, String username, String password, String remotePath,    
  118.             String fileName, String localPath) {    
  119.         boolean result = false;    
  120.         FTPClient ftp = new FTPClient();    
  121.         try {    
  122.             int reply;    
  123.             ftp.connect(host, port);    
  124.             // 如果采用默认端口,可以使用ftp.connect(host)的方式直接连接FTP服务器    
  125.             ftp.login(username, password);// 登录    
  126.             reply = ftp.getReplyCode();    
  127.             if (!FTPReply.isPositiveCompletion(reply)) {    
  128.                 ftp.disconnect();    
  129.                 return result;    
  130.             }    
  131.             ftp.changeWorkingDirectory(remotePath);// 转移到FTP服务器目录    
  132.             FTPFile[] fs = ftp.listFiles();    
  133.             for (FTPFile ff : fs) {    
  134.                 if (ff.getName().equals(fileName)) {    
  135.                     File localFile = new File(localPath + "/" + ff.getName());    
  136.     
  137.                     OutputStream is = new FileOutputStream(localFile);    
  138.                     ftp.retrieveFile(ff.getName(), is);    
  139.                     is.close();    
  140.                 }    
  141.             }    
  142.     
  143.             ftp.logout();    
  144.             result = true;    
  145.         } catch (IOException e) {    
  146.             e.printStackTrace();    
  147.         } finally {    
  148.             if (ftp.isConnected()) {    
  149.                 try {    
  150.                     ftp.disconnect();    
  151.                 } catch (IOException ioe) {    
  152.                 }    
  153.             }    
  154.         }    
  155.         return result;    
  156.     }    
  157. }  

 

 

springMVC的使用:

 

[java]  view plain  copy
 
  1.      
  2.     @Autowired  
  3.     private FtpConfig ftpConfig;  
  4.   
  5.     @RequestMapping("/uploadFiles")  
  6.     @ResponseBody  
  7.  public MSG uploadFiles(@RequestParam("albumId")Integer albumId,@RequestParam("file")MultipartFile[] files) throws IOException {  
  8.   
  9.         List<Photo> photoList = new ArrayList<Photo>();  
  10.   
  11.         //循环上传多个图片  
  12.         for(MultipartFile file:files){  
  13.             Photo photo = new Photo();  
  14.   
  15.             String oldName = file.getOriginalFilename();  
  16.             String picNewName = UploadUtils.generateRandonFileName(oldName);//通过工具类产生新图片名称,防止重名  
  17.   
  18.             String picSavePath = UploadUtils.generateRandomDir(picNewName);//通过工具类把图片目录分级  
  19.   
  20.             photo.setPhotoUrl(picSavePath+"/"+picNewName);//设置图片的url--》就是存储到数据库的字符串url  
  21.             photo.setAlbumId(albumId);//设置图片所属相册id  
  22.             photo.setPhotoDesc(oldName);//设置图片描述  
  23.   
  24.             photoList.add(photo);  
  25.   
  26.             FtpUtil.pictureUploadByConfig(ftpConfig,picNewName,picSavePath,file.getInputStream());//上传到图片服务器的操作  
  27.         }  
  28.   
  29.         //添加到数据库  
  30.         iPhotoService.savePhotoList(photoList);//调用service层方法  
  31.   
  32.         return MSG.success();//上传成功做的操作,我这里返回上传成功的信号  
  33.     }  

 

 

UploadUtils.java工具类:

 

[java]  view plain  copy
 
  1. public class UploadUtils {  
  2.       
  3.     /** 
  4.      * 得到真实文件名 
  5.      * @param fileName 
  6.      * @return 
  7.      */  
  8.     public static String subFileName(String fileName){  
  9.         //查找最后一个 \ (文件分隔符)位置  
  10.         int index = fileName.lastIndexOf(File.separator);  
  11.         if(index == -1){  
  12.             //没有分隔符,说明是真实名称  
  13.             return fileName;  
  14.         }else {  
  15.             return fileName.substring(index+1);  
  16.         }  
  17.     }  
  18.   
  19.     /** 
  20.      * 获得随机UUID文件名 
  21.      * @param fileName 
  22.      * @return 
  23.      */  
  24.     public static String generateRandonFileName(String fileName){  
  25.         //首相获得扩展名,然后生成一个UUID码作为名称,然后加上扩展名  
  26.         String ext = fileName.substring(fileName.lastIndexOf("."));  
  27.         return UUID.randomUUID().toString()+ext;  
  28.     }  
  29.   
  30.     /** 
  31.      * 获得hashcode 生成二级目录 
  32.      * @param uuidFileName 
  33.      * @return 
  34.      */  
  35.     public static String generateRandomDir(String uuidFileName){  
  36.         int hashCode = uuidFileName.hashCode();//得到它的hashcode编码  
  37.         //一级目录  
  38.         int d1 = hashCode & 0xf;  
  39.         //二级目录  
  40.         int d2 = (hashCode >> 4) & 0xf;  
  41.         return "/"+d1+"/"+d2;  
  42.     }  
  43. }  


最后亲测能够实现上传。

转载自:http://blog.csdn.net/maoyuanming0806/article/details/78068091


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM