Java项目实战 - 图片Server管理和图片上传

要分布式的环境中,一般会配置一个专门的图片Server。

图片服务器

  • Nginx作为http服务
  • ftp上传图片 - linux自带:vsftpd。

Nginx和vsftpd都需要安装配置,不做说明。

配置信息

文件上传解析器

1
2
3
4
5
6
7
8
<!-- 定义文件上传解析器 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

<!-- 设定默认编码 -->
<property name="defaultEncoding" value="UTF-8"></property>
<!-- 设定文件上传的最大值5MB,5*1024*1024 -->
<property name="maxUploadSize" value="5242880"></property>
</bean>

创建公共Properties

在properties下创建resource.properties文件

1
2
3
4
5
6
7
8
9
#FTP配置
FTP_IP=192.168.220.133
FTP_PORT=21
FTP_USERNAME=ftpuser
FTP_PASSWORD=ftpuser
FTP_BASE_PATH=/home/ftpuser/www/images

#图片Several配置
IMAGE_BASE_PATH=http://192.168.220.133/images

并修改<context:property-placeholder location="classpath:properties/db.properties" /> to <context:property-placeholder location="classpath:properties/*.properties" />

Service

封装了一个公共的File Upload的方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
@Service
public class PictureServiceImpl implements PictureService {

//利用这种方式来取resource.properties的配置
@Value("${FTP_IP}")
private String FTP_IP;
@Value("${FTP_PORT}")
private Integer FTP_PORT;
@Value("${FTP_USERNAME}")
private String FTP_USERNAME;
@Value("${FTP_PASSWORD}")
private String FTP_PASSWORD;
@Value("${FTP_BASE_PATH}")
private String FTP_BASE_PATH;
@Value("${IMAGE_BASE_PATH}")
private String IMAGE_BASE_PATH;


@Override
public Map uploadPicture(MultipartFile uploadFile) {
Map resultMap = new HashMap<>();

try {
// 生成新文件名
String oldname = uploadFile.getOriginalFilename();
String newname = UUID.randomUUID().toString();
newname = newname + oldname.substring(oldname.lastIndexOf("."));

//上传图片
String filepath = new DateTime().toString("/yyyy/MM/dd");
boolean result = FtpUtil.uploadFile(FTP_IP, FTP_PORT, FTP_USERNAME, FTP_PASSWORD, FTP_BASE_PATH,
filepath, newname, uploadFile.getInputStream());
if(!result){
resultMap.put("error", 1);
resultMap.put("message", "File upload failed");
return resultMap;
}
resultMap.put("error", 0);
resultMap.put("url", IMAGE_BASE_PATH + filepath + "/" + newname);
return resultMap;

} catch (Exception e) {
resultMap.put("error", 1);
resultMap.put("message", "File upload failed");
return resultMap;
}
}
}

Controller

1
2
3
4
5
6
7
8
9
10
11
12
13
@Controller
public class PictureController {

@Autowired
private PictureService pictureService;

@RequestMapping("/pic/upload")
@ResponseBody
public String pictureUpload(MultipartFile uploadFile){
Map result = pictureService.uploadPicture(uploadFile);
return JsonUtils.objectToJson(result);//处理浏览器兼容性
}
}

运行结果

唐胡璐 wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!
分享创造价值,您的支持将鼓励我继续前行!