SpringMvc的文件上传

一.SpringMvc上传组件简介

  MultipartResolver,SpringMvc的文件上传就是通过这个组件来完成的。使用的话要在SpringMvc的配置文件Dispatch-Servlet里面配置multipartResolver这个bean了,再配置一下最大上传的大小,编解码字符集等,如下:

<!-- 文件上传 -->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="10485760"/> <!-- 10m -->
        <property name="maxInMemorySize" value="4096" />
        <property name="defaultEncoding" value="UTF-8"></property>
    </bean>

 

二.文件上传业务流程

  1.前台的Controller层接收MutipartFilelei类型的file,以及要创建一个文件夹来存放要上传的文件(通过代码创建),下面的代码会在WEB_INF下创建一个名字为upload的文件夹。

String path = request.getSession().getServletContext().getRealPath("upload");

  2.接着到Service层编写具体业务,编写upload方法。

 

 public String upLoad(MultipartFile file,String path){
     //获取要上传的文件的名字,如abc.jpg String fileName
= file.getOriginalFilename(); //获取扩展名,比如 jpg String extentionName = fileName.substring(fileName.lastIndexOf(".")+1); //获取最终的上传文件名 String upLoadFileName = UUID.randomUUID().toString()+"."+extentionName; //根据路径创建新文件 File fileDir = new File(path); //不存在的话创建新文件 if(!fileDir.exists()){ fileDir.setWritable(true); fileDir.mkdir(); } //在项目的upload文件夹创建完整的新文件 File targetFile = new File(path,upLoadFileName); //开始上传 try {
       //这个是SpringMvc的方法,传到我们的upload文件夹下了 file.transferTo(targetFile);
//使用FTP工具类上传到ftp服务器 FTPUtil.uploadFile(Lists.newArrayList(targetFile));        //上传到ftp服务器后就删除upload文件夹 targetFile.delete(); } catch (IOException e) { e.printStackTrace(); } return targetFile.getName(); }

  3.编写FTPUtil工具类

   
  //这是一些连接服务器方法需要的变量,需要构造器初始化,再生成setget方法就行
  private
String ip; private int port; private String user; private String pwd; private FTPClient ftpClient;

   这些是编写上传文件到服务器主要的变量,从本地的PropertiesUtil里面设置好的读取出来。

 private static  final Logger logger = LoggerFactory.getLogger(FTPUtil.class);
    private static String ftpIp = PropertiesUtil.getProperty("ftp.server.ip");
    private static String ftpUser = PropertiesUtil.getProperty("ftp.user");
    private static String ftpPass = PropertiesUtil.getProperty("ftp.pass");

   私有的上传文件到服务器的方法,真正上传的方法,对外公开的是调用这个私有方法实现的。

 

private boolean uploadFile(String remotePath,List<File> fileList) throws IOException {
        boolean uploaded = true;
        FileInputStream fis = null;
        //连接FTP服务器
        if(connectServer(this.ip,this.port,this.user,this.pwd)){
            try {
          //这个remotePath就是不传到默认的目录下,而是自己给的目录下。 ftpClient.changeWorkingDirectory(remotePath); ftpClient.setBufferSize(
1024); ftpClient.setControlEncoding("UTF-8");
          //二进制方式传输 ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
          //被动传输模式 ftpClient.enterLocalPassiveMode();
for(File fileItem : fileList){
            //文件读取流 fis
= new FileInputStream(fileItem);
            //保存文件 ftpClient.storeFile(fileItem.getName(),fis); } }
catch (IOException e) { logger.error("上传文件异常",e); uploaded = false; e.printStackTrace(); } finally {
          //记得释放文件流 fis.close(); ftpClient.disconnect(); } }
return uploaded; }

   连接服务器的方法,很简单的api调用,新建客户端然后尝试login,通过返回值判断是否连接成功。

private boolean connectServer(String ip,int port,String user,String pwd){
        boolean isSuccess = false;
        ftpClient = new FTPClient();
        try {
            ftpClient.connect(ip);
            isSuccess = ftpClient.login(user,pwd);
        } catch (IOException e) {
            logger.error("连接FTP服务器异常",e);
        }
        return isSuccess;
    }

  然后就是Service层调用这个方法上传到FTP服务器就行了,然后删除upload文件夹,回到Controller层的话就是还要根据ftp服务器和文件名称生成一个url,保存到一个map里面返回给前端,后台的上传业务基本结束。前台测试时记得,表单里面有个enctype的,记得选muti的那个哈。

 

三.FTP服务器的搭建与配置

  1.Lunix下

    太复杂了...,目前只是为了学习使用上传功能,所以还没配置。

  2.Windows下

    下载了一个绿色版,设置用户名和密码,用ftp://+本机ip地址就可以连接自己的ftp服务器。

四.FTP协议

  1.特点

   1.FTP分为客户端和服务端,它们之间是通过两条TCP连接来完成连接,上传下载功能的,一条叫做TCP控制连接,一条叫TCP数据连接。

   2.控制连接默认使用21端口,用于发送FTP命令信息。而数据连接是通过20端口.

  2.传输模式

   1.主动连接:客户端先从N>1023的任意一个端口通过TCP连接通道向服务器的21端口发送连接,说明自己开了一个端口(N+1)在监听,你要发数据就发这个吧。服务器主动从20端口向客户端发连接,一般如果FTP客户端开了防火墙的话,就很容易屏蔽服务器发的请求。

   2.被动连接:FTP客户端随意打开两个端口N>1023,和N+1,第一个端口会连接21端口,然后服务器开了一个随意的非特权端口P,发送PORT P命令给客户端。然后客户端发起从本地端口N+1到服务器的端口P的连接用来传送数据。FTP服务端被动响应连接,这个时候如果开了防火墙,客户端就访问不了了。

 

posted @ 2018-11-08 16:46  AJimmyFang  阅读(633)  评论(0编辑  收藏  举报