标签:客户 turn 服务 目的 bean 上传文件 pwd windows target
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://+本机ip地址就可以连接自己的ftp服务器。
1.FTP分为客户端和服务端,它们之间是通过两条TCP连接来完成连接,上传下载功能的,一条叫做TCP控制连接,一条叫TCP数据连接。
2.控制连接默认使用21端口,用于发送FTP命令信息。而数据连接是通过20端口.
1.主动连接:客户端先从N>1023的任意一个端口通过TCP连接通道向服务器的21端口发送连接,说明自己开了一个端口(N+1)在监听,你要发数据就发这个吧。服务器主动从20端口向客户端发连接,一般如果FTP客户端开了防火墙的话,就很容易屏蔽服务器发的请求。
2.被动连接:FTP客户端随意打开两个端口N>1023,和N+1,第一个端口会连接21端口,然后服务器开了一个随意的非特权端口P,发送PORT P命令给客户端。然后客户端发起从本地端口N+1到服务器的端口P的连接用来传送数据。FTP服务端被动响应连接,这个时候如果开了防火墙,客户端就访问不了了。
标签:客户 turn 服务 目的 bean 上传文件 pwd windows target
原文地址:https://www.cnblogs.com/JimmyFanHome/p/9930044.html