單文件上傳
1.加載jar包
<!-- 文件上傳 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<!-- ftp需要使用jar包-->
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.3</version>
</dependency>
2.配置application.yml
server:
port: 5300
spring:
mvc:
view:
prefix: /WEB-INF/
suffix: .jsp
ftp_address: 192.168.1.139
ftp_port: 21
ftp_username: admin
ftp_password: admin
ftp_workdirectory: /home/admin
3.編寫jsp
<form action="upload" method="post" enctype="multipart/form-data">
<input type="file" name="file" ><br>
<input type="submit" value="上傳">
</form>
|
4編寫controller
package com.s;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import sun.net.ftp.FtpClient;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
@Controller
public class UploadContoller {
@Value("${ftp_address}")
private String ip;
@Value("${ftp_port}")
private int port;
@Value("${ftp_username}")
private String username;
@Value("${ftp_password}")
private String password;
@Value("${ftp_workdirectory}")
private String path;
@RequestMapping("show")
public String query(){
return "file";
}
@PostMapping("upload")
@ResponseBody
public String upload(@RequestParam("file") MultipartFile file){
String fileName= file.getOriginalFilename();
System.out.println("文件名:"+fileName);
String flag="";
try {
InputStream inputStream = file.getInputStream();//spring提供的文件流
flag= connectFTP(ip,port,username,password,path,fileName,inputStream);
}catch(IOException e){
e.printStackTrace();
}
return flag;
}
public String connectFTP(String ip,Integer port,String username,String password,String path,String filename,InputStream inputStream){
//連接ftp
FTPClient ftpClient= new FTPClient();
try {
ftpClient.connect(ip, port);//連接ftp
ftpClient.login(username, password);//ftp 用戶名和密碼
//測試連接是否成功 200-300之間 說明連接成功 否則連接失敗
int code= ftpClient.getReplyCode();
System.out.println("響應碼是"+code);
if(!FTPReply.isPositiveCompletion(code)){
ftpClient.disconnect();
}
//設置文件上傳路徑
ftpClient.changeWorkingDirectory(path);
//設置上傳二進制文件
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
//真正保存的ftp服務器
boolean flag=ftpClient.storeFile(filename,inputStream);
if(flag){
return "success" ;
}
else{
return "error";
}
}
catch (Exception e){
e.printStackTrace();
}finally {
try{
ftpClient.disconnect();}
catch (Exception e){
e.printStackTrace();
}
}
return "";
}
}
|
5.測試
http://localhost:5300/show
多文件上傳(pom和配置文件省略)
1.編寫多文件上傳的jsp頁面
<form action="uploads" method="post" enctype="multipart/form-data">
<input type="file" name="files" ><br>
<input type="file" name="files" ><br>
<input type="file" name="files" ><br>
<input type="file" name="files" ><br>
<input type="submit" value="上傳">
</form>
|
2.編寫controller
package com.s;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
@Controller
public class UploadsContoller {
@Value("${ftp_address}")
private String ip;
@Value("${ftp_port}")
private int port;
@Value("${ftp_username}")
private String username;
@Value("${ftp_password}")
private String password;
@Value("${ftp_workdirectory}")
private String path;
@RequestMapping("shows")
public String query(){
return "files";
}
@PostMapping("uploads")
@ResponseBody
public String upload(@RequestParam("files") MultipartFile[] file){
// String fileName= file.getOriginalFilename();
System.out.println("文件個數:"+file.length);
String msg="success";
for(MultipartFile f:file){
try {
String fileName= f.getOriginalFilename();
System.out.println("文件名"+fileName);
InputStream inputStream = f.getInputStream();//spring提供的文件流
String flag = connectFTP(ip,port,username,password,path,fileName,inputStream);
}catch(IOException e){
msg="fail";
e.printStackTrace();
}
}
return msg;
}
public String connectFTP(String ip,Integer port,String username,String password,String path,String filename,InputStream inputStream){
//連接ftp
FTPClient ftpClient= new FTPClient();
try {
ftpClient.connect(ip, port);//連接ftp
ftpClient.login(username, password);//ftp 用戶名和密碼
//測試連接是否成功 200-300之間 說明連接成功 否則連接失敗
int code= ftpClient.getReplyCode();
System.out.println("響應碼是"+code);
if(!FTPReply.isPositiveCompletion(code)){
ftpClient.disconnect();
}
//設置文件上傳路徑
ftpClient.changeWorkingDirectory(path);
//設置上傳二進制文件
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
//真正保存的ftp服務器
boolean flag=ftpClient.storeFile(filename,inputStream);
if(flag){
return "success" ;
}
else{
return "error";
}
}
catch (Exception e){
e.printStackTrace();
}finally {
try{
ftpClient.disconnect();}
catch (Exception e){
e.printStackTrace();
}
}
return "";
}
}
|
3.訪問
http://localhost:5300/shows