提交 bfb12142 authored 作者: zhangshuang's avatar zhangshuang

ftp文件服务器

上级 eb133bcb
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent> <parent>
<artifactId>ds</artifactId> <groupId>org.springframework.boot</groupId>
<groupId>com.zjty.ds</groupId> <artifactId>spring-boot-starter-parent</artifactId>
<version>1.0-SNAPSHOT</version> <version>2.2.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <groupId>com.zjty</groupId>
<artifactId>ftp</artifactId>
<artifactId>ds-ftp</artifactId> <version>0.0.1-SNAPSHOT</version>
<name>ftp</name>
<name>ds-ftp</name> <description>Demo project for Spring Boot</description>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.8</java.version>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties> </properties>
<dependencies> <dependencies>
<dependency> <dependency>
<groupId>junit</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>junit</artifactId> <artifactId>spring-boot-starter</artifactId>
<version>4.11</version> </dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.6</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope> <scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.46</version>
</dependency> </dependency>
</dependencies> </dependencies>
<build> <build>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) --> <plugins>
<plugins> <plugin>
<!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle --> <groupId>org.springframework.boot</groupId>
<plugin> <artifactId>spring-boot-maven-plugin</artifactId>
<artifactId>maven-clean-plugin</artifactId> </plugin>
<version>3.1.0</version> </plugins>
</plugin>
<!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
<!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
<plugin>
<artifactId>maven-site-plugin</artifactId>
<version>3.7.1</version>
</plugin>
<plugin>
<artifactId>maven-project-info-reports-plugin</artifactId>
<version>3.0.0</version>
</plugin>
</plugins>
</pluginManagement>
</build> </build>
</project> </project>
package com.zjty.ftp;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class FtpApplication {
public static void main(String[] args) {
SpringApplication.run(FtpApplication.class, args);
}
}
package com.zjty.ftp.base.response;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* <p>Description : 异常结果枚举类,用于统一异常状态码与相关描述信息
* @Date : 2017/12/13 0:51
* @author : M@tr!x [xhyrzldf@foxmail.com]
*/
@AllArgsConstructor
@Getter
public enum ResponseCode {
/**
* 服务器成功返回用户请求的数据
*/
OK(200, "[GET]:服务器成功返回用户请求的数据,返回资源对象"),
/**
* 用户新建或修改数据成功
*/
CREATED(201, "[POST/PUT/PATCH]:用户新建或修改数据成功,返回新生成或修改的资源对象"),
/**
* 表示一个请求已经进入后台排队(异步任务)
*/
ACCEPTED(202, "[*]:表示一个请求已经进入后台排队(异步任务)"),
/**
* 用户上传文件成功
*/
UPLOADED(203, "[POST]文件上传成功"),
/**
* 用户删除数据成功
*/
NO_CONTENT(204, " [DELETE]:用户删除数据成功"),
/**
* 用户发出的请求有错误,服务器没有进行新建或修改数据的操作
*/
INVALID_REQUEST(400, "[POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作"),
/**
* 表示用户没有权限(令牌、用户名、密码错误)
*/
UNAUTHORIZED(401, " [*]:表示用户没有权限(令牌、用户名、密码错误)"),
/**
* 表示用户登录超时
*/
LOGINOUTTIME(402, " [*]:表示用户登录超时"),
/**
* 表示用户得到授权(与401错误相对),但是访问是被禁止的
*/
FORBIDDEN(403, " [*] 表示用户得到授权(与401错误相对),但是访问是被禁止的"),
/**
* 用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的
*/
NOT_FOUND(404, " [*]:用户发出的请求针对的是不存在的记录,服务器没有进行操作"),
/**
* 非法参数,请求中附带的参数不符合要求规范
*/
ILLEGAL_PARAMETER(405, "[*]:非法参数,请求中附带的参数不符合要求规范"),
/**
* 用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)
*/
NOT_ACCEPTABLE(406, " [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)"),
/**
* 用户的参数不得为空
*/
NOT_NULL_PARAMETER(408, "传递的参数不能为空"),
/**
* 用户请求的资源被永久删除,且不会再得到的
*/
GONE(413, "[GET]:用户请求的资源被永久删除,且不会再得到的"),
/**
* [PUT,PATCH,POST,DELETE]:操作没有成功,并没有数据发生变化
*/
NO_CHANGED(414, "[PUT,PATCH,POST,DELETE]:操作没有成功,并没有数据发生变化"),
/**
* 创建一个对象时,发生一个验证错误
*/
UNPROCESSABLE_ENTITY(422, "[POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误"),
/**
* 服务器发生错误
*/
INTERNAL_SERVER_ERROR(500, "服务器发生错误");
/**
* 结果代码编号
*/
private Integer code;
/**
* 结果信息
*/
private String msg;
}
package com.zjty.ftp.base.response;
import com.alibaba.fastjson.annotation.JSONField;
import lombok.Getter;
import static com.zjty.ftp.base.response.ResponseCode.*;
/**
* Description : 结果类,用于统一返回格式 对外提供关于响应结果的很多便利的静态方法
*
* @author : M@tr!x [xhyrzldf@foxmail.com]
* @Date : 2017/12/13 0:05
*/
@SuppressWarnings({"WeakerAccess", "unused"})
@Getter
public class ServerResponse<T> {
/**
* 错误码
*/
@JSONField(ordinal = 1)
private Integer code;
/**
* 提示信息
*/
@JSONField(ordinal = 2)
private String msg;
/**
* 具体的内容
*/
@JSONField(ordinal = 3)
private T data;
/* 以下为返回成功响应结果的各类重载静态方法 */
public static <T> ServerResponse<T> success() {
return new ServerResponse<>(OK.getCode(), OK.getMsg());
}
public static <T> ServerResponse<T> success(T data) {
return new ServerResponse<>(OK.getCode(), OK.getMsg(), data);
}
public static <T> ServerResponse<T> success(String msg, T data) {
return new ServerResponse<>(OK.getCode(), msg, data);
}
public static <T> ServerResponse<T> saveSuccess(T data) {
return new ServerResponse<>(CREATED.getCode(), CREATED.getMsg(), data);
}
public static <T> ServerResponse<T> deleteSuccess() {
return new ServerResponse<>(NO_CONTENT.getCode(), NO_CONTENT.getMsg());
}
public static <T> ServerResponse<T> deleteSuccessWithCount(Number effectCount) {
return new ServerResponse<>(NO_CONTENT.getCode(), "删除成功,操作删除的数据条数为: " + effectCount);
}
public static <T> ServerResponse<T> deleteSuccessWithId(Number id) {
return new ServerResponse<>(NO_CONTENT.getCode(), "删除成功,操作删除的数据id为: " + id);
}
public static <T> ServerResponse<T> uploadSuccess(T data) {
return new ServerResponse<>(UPLOADED.getCode(), UPLOADED.getMsg(), data);
}
public static <T> ServerResponse<T> messageSuccess(String msg) {
return new ServerResponse<>(OK.getCode(), msg);
}
/* 以下为返回失败响应结果的各类重载静态方法 */
public static <T> ServerResponse<T> error() {
return new ServerResponse<>(INTERNAL_SERVER_ERROR.getCode(), INTERNAL_SERVER_ERROR.getMsg());
}
public static <T> ServerResponse<T> error(String errorMessage) {
return new ServerResponse<>(INTERNAL_SERVER_ERROR.getCode(), errorMessage);
}
public static <T> ServerResponse<T> error(ResponseCode responseCode) {
return new ServerResponse<>(responseCode.getCode(), responseCode.getMsg());
}
public static <T> ServerResponse<T> error(ResponseCode responseCode, String errorMessage) {
return new ServerResponse<>(responseCode.getCode(), errorMessage);
}
public static <T> ServerResponse<T> error(ResponseCode responseCode, String errorMessage,T data) {
return new ServerResponse<>(responseCode.getCode(), errorMessage,data);
}
/* 以下为提供给CONTROL层向文件服务器操作文件获得相应结果的相关方法 */
// /**
// * <b>向文件服务器上传文件并且取得{@code {@link ServerResponse}}类型的响应结果</b>
// * <p>
// * <p>封装了control层的关于文件上传的代码
// * <p>
// * <p>例如file是a.txt,dirName=template, 在文件服务器上存放的位置就是{@code root(根目录)/template/a.txt }
// *
// * @param file {@link MultipartFile} 接受到的文件俺对象
// * @param dirName 在文件服务器上的文件夹名
// * @return {@link ServerResponse} (包含了成功与导致失败的结果)
// */
// public static ServerResponse uploadAndGet(
// @RequestParam("file") Optional<MultipartFile> file, String dirName) {
// // 空指针判断
// if (!file.isPresent()) return error(NOT_NULL_PARAMETER);
// // 上传文件并且获得相应结果
// MultipartFile uploadFile = file.get();
// FileServerResponse fsp =
// HttpClientUtil.uploadFileToServer(uploadFile, dirName, uploadFile.getOriginalFilename());
// // 根据返回结果的状态码确定相应的返回信息(200返回成功,否则error)
// return (fsp.getCode() == 200) ? uploadSuccess(fsp.getData()) : error(NO_CHANGED, fsp.getMsg());
// }
// /**
// * <b>向文件服务器删除文件并且取得{@code {@link ServerResponse}}类型的响应结果</b>
// * <p>
// * <p>封装了control层的关于文件上传的代码
// * <p>
// * <p>例如提供的参数如下
// * <li>fileName = reset-hv_20180115144834_wV9A9iVD.png
// * <li>dirName = templates
// * <li>那么实际删除的文件路径为: {@code root(根目录)/templates/reset-hv_20180115144834_wV9A9iVD.png}
// *
// * @param fileName 要删除的文件名<b>注意是文件服务器上的文件名,例如<b>reset-hv_20180115144834_wV9A9iVD.png</b> 格式为{@code
// * 原始文件名_timestamp_uuid8位}
// * @param dirName 要删除的文件所处的文件目录
// * @return {@link ServerResponse} (包含了成功与导致失败的结果)
// */
// public static ServerResponse deleteAndGet(
// @RequestParam(value = "fileName") Optional<String> fileName, String dirName) {
// // 空指针判断
// if (!fileName.isPresent()) return error(NOT_NULL_PARAMETER);
// // 发送删除文件的请求,附带文件所在的目录和在服务器中的文件名
// FileServerResponse fsp = HttpClientUtil.daleteFileToServer(dirName, fileName.get());
// // 根据返回结果的状态码确定相应的返回信息(200返回成功,否则error)
// return (fsp.getCode() == 200) ? deleteSuccess() : error(NO_CHANGED, fsp.getMsg());
// }
/* 将构造器私有,防止外部进行实例化 仅提供给内部静态方法调用 * */
private ServerResponse() {
}
private ServerResponse(Integer code) {
this.code = code;
}
private ServerResponse(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
private ServerResponse(String msg, T data) {
this.msg = msg;
this.data = data;
}
private ServerResponse(Integer code, String msg, T data) {
this.code = code;
this.msg = msg;
this.data = data;
}
}
package com.zjty.ftp.controller;
import com.zjty.ftp.base.response.ServerResponse;
import com.zjty.ftp.service.FileDownLoadService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@RestController
@RequestMapping("/file")
public class FileDownLoadController {
@Autowired
private FileDownLoadService fileDownLoadService;
@GetMapping("/downLoad/{fileName}")
public void fileDownLoad(@PathVariable("fileName") String fileName, HttpServletResponse response, HttpServletRequest request){
fileDownLoadService.fileDownLoad(fileName,response,request);
}
}
package com.zjty.ftp.controller;
import com.zjty.ftp.base.response.ServerResponse;
import com.zjty.ftp.service.FileUploadService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
@RestController
@RequestMapping("/file")
public class FileUploadController {
@Autowired
private FileUploadService fileUploadService;
//文件上传
@PutMapping("/upload")
public ServerResponse fileUpload(HttpServletRequest httpServletRequest){
return fileUploadService.fileUpload(httpServletRequest);
}
}
package com.zjty.ftp.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@AllArgsConstructor
@NoArgsConstructor
@Data
public class FileReturn {
private String name;//上传文件名称
private String path;//上传文件地址
}
package com.zjty.ftp.service;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public interface FileDownLoadService {
void fileDownLoad(String fileName, HttpServletResponse response, HttpServletRequest httpServletRequest);
}
package com.zjty.ftp.service;
import com.zjty.ftp.base.response.ServerResponse;
import javax.servlet.http.HttpServletRequest;
public interface FileUploadService {
ServerResponse fileUpload(HttpServletRequest request);
}
package com.zjty.ftp.service.impl;
import com.zjty.ftp.base.response.ServerResponse;
import com.zjty.ftp.service.FileDownLoadService;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
@Service
public class FileDownLoadServiceImpl implements FileDownLoadService {
@Override
public void fileDownLoad(String fileName, HttpServletResponse response, HttpServletRequest httpServletRequest) {
/*response.setContentType("application/force-download");// 设置强制下载不打开
response.addHeader("Content-Disposition", "attachment;fileName=" + fileName);// 设置文件名
*/
response.setHeader("content-type", "application/octet-stream");
response.setContentType("application/octet-stream");
try {
response.setHeader("Content-Disposition", "attachment;filename="+new String(fileName.getBytes("utf-8"),"utf-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
setFileDownloadHeader(httpServletRequest,response,fileName);
OutputStream os = null;
InputStream is = null;
BufferedInputStream bs = null;
byte[] buffer = new byte[1024];
try {
is = new FileInputStream(new File("/file/uploads/" + fileName));
bs = new BufferedInputStream(is);
os = response.getOutputStream();
int i = bs.read(buffer);
while (i != -1) {
os.write(buffer, 0, i);
i = bs.read(buffer);
}
os.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
bs.close();
is.close();
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 解决中文名称
* @param request
* @param response
* @param fileName
*/
public void setFileDownloadHeader(HttpServletRequest request, HttpServletResponse response, String fileName) {
try {
//中文文件名支持
String encodedfileName;
String agent = request.getHeader("USER-AGENT");
if (null != agent && agent.contains("MSIE")) {//IE
encodedfileName = java.net.URLEncoder.encode(fileName, "UTF-8");
} else if (null != agent && agent.contains("Mozilla")) {
encodedfileName = new String(fileName.getBytes("UTF-8"), "iso-8859-1");
} else {
encodedfileName = java.net.URLEncoder.encode(fileName, "UTF-8");
}
response.setHeader("Content-Disposition", "attachment; filename=\"" + encodedfileName + "\"");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
package com.zjty.ftp.service.impl;
import com.zjty.ftp.service.FileUploadService;
import com.zjty.ftp.base.response.ServerResponse;
import com.zjty.ftp.entity.FileReturn;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
@Service
public class FileUploadServiceImpl implements FileUploadService {
/**
* 前台文件上传
* @param request
* @return
*/
@Override
public ServerResponse fileUpload(HttpServletRequest request) {
List<MultipartFile> multipartFiles = ((MultipartHttpServletRequest)request).getFiles("file");
List<FileReturn> fileReturns = new ArrayList<>();
for(MultipartFile multipartFile:multipartFiles){
InputStream is = null;
BufferedInputStream bis = null;
FileOutputStream fos = null;
BufferedOutputStream bos = null;
FileReturn fileReturn = new FileReturn();
String sourceName = multipartFile.getOriginalFilename();
//String suffix = sourceName.substring(sourceName.lastIndexOf("."));
//String fileName = UUID.randomUUID().toString() + suffix;
//不存在该目录,创建目录
File file = new File("/file/uploads");
if(!file.exists()){
file.mkdirs();
}
String savePath = file.getAbsolutePath() + "/" + sourceName;
fileReturn.setName(sourceName);
fileReturn.setPath(savePath);
fileReturns.add(fileReturn);
File createFile = new File(savePath);
try {
is = multipartFile.getInputStream();
bis = new BufferedInputStream(is);
fos = new FileOutputStream(createFile);
bos = new BufferedOutputStream(fos);
int len = -1;
byte[] b = new byte[1024];
while ((len = bis.read(b)) != -1){
bos.write(b,0,len);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
bis.close();
is.close();
bos.close();
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
return ServerResponse.success(fileReturns);
}
}
server.port=8093
# spring-http-ļϴ
spring.servlet.multipart.max-file-size=200MB
spring.servlet.multipart.max-request-size=200MB
package com.zjty.ftp;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class FtpApplicationTests {
@Test
void contextLoads() {
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论