发表于: 2017-09-29 19:35:12
1 668
今天完成的事情:
花了些时间完成了图片上传功能,但是图片上传成功之后把它变成头像这点卡了一会,因为本地的图片地址是无法在jsp页面显示的。后来想到了一种简单的解决办法,就是上传图片的同时copy一份到项目的webapp下,这样就可以在项目里引用了,代码如下
controller
@RequestMapping(value = "/register",method = RequestMethod.POST)
public String register(User user, Integer message,HttpServletRequest request){
HttpSession session = request.getSession();
Integer verify= (Integer) session.getAttribute("verify");
String pic= (String) session.getAttribute("picture");
logger.info("verify="+verify);
logger.info("message="+message);
if (message.equals(verify)&&message != null){
User user1=new User();
user1.setUser(user.getUser());
String md5= MD5Util.stringToMD5(user.getUser()+user.getPassword());
user1.setPassword(md5);
user1.setMobile(user.getMobile());
user1.setEmail(user.getEmail());
user1.setPicture("../picture/"+pic);
userService.sendEmail(user.getEmail());
userService.insert(user1);
return "success";
}else{
return "fail";
}
}
@RequestMapping(value = "/pic",method = RequestMethod.GET)
public String aa(){
return "pic";
}
@RequestMapping(value = "/pic",method = RequestMethod.POST)
public String doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
//1、创建一个DiskFileItemFactory工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
//2、创建一个文件上传解析器
ServletFileUpload upload = new ServletFileUpload(factory);
//解决上传文件名的中文乱码
upload.setHeaderEncoding("UTF-8");
factory.setSizeThreshold(1024 * 500);//设置内存的临界值为500K
File linshi = new File("F:\\linshi");//当超过500K的时候,存到一个临时文件夹中
factory.setRepository(linshi);
upload.setSizeMax(1024 * 1024 * 5);//设置上传的文件总的大小不能超过5M
try {
// 1. 得到 FileItem 的集合 items
List<FileItem> /* FileItem */items = upload.parseRequest(request);
// 2. 遍历 items:
for (FileItem item : items) {
// 若是文件域则把文件保存到 e:\\files 目录下.
String fileName = item.getName();
long sizeInBytes = item.getSize();
System.out.println(fileName);
System.out.println(sizeInBytes);
HttpSession session = request.getSession();
session.setAttribute("picture",fileName);
InputStream in = item.getInputStream();
byte[] buffer = new byte[1024];
int len = 0;
fileName = "c:\\Users\\HP\\IdeaProjects\\mytask\\src\\main\\webapp\\picture\\" + fileName;//文件最终上传的位置
System.out.println("这是什么"+fileName);
OutputStream out = new FileOutputStream(fileName);
while ((len = in.read(buffer)) != -1) {
out.write(buffer, 0, len);
}
userService.qingniu(fileName);
out.close();
in.close();
}
} catch (FileUploadException e) {
e.printStackTrace();
}
return "regist";
}
上传图片的controller要单独写一个jsp页面,因为涉及到了form表单的提交,一个jsp没法提交两次,或者可以我还不会弄。。
jsp
<html>
<head>
<title>上传图片</title>
</head>
<body>
<form action="pic" method="post" enctype="multipart/form-data">
注册之前先给自己传个图片吧:<input type="file" name="fileupload"/>
<input type="submit" class="btn_zhuce" value="上传"/>
</form>
</body>
</html>
实现类
public void qingniu(String file){
System.out.println("Enter StudentServiceImpl.putPicture()");
//用来存文件名
String key = null;
try {
String newURL = file.replaceAll("\\\\", "/");
System.out.println("转义后的文件路径:" + newURL);
//构造一个带指定Zone对象的配置类
Configuration cfg = new Configuration(Zone.zone2());
//...其他参数参考类注释
UploadManager uploadManager = new UploadManager(cfg);
//...生成上传凭证,然后准备上传
//如果是Windows情况下,格式是 D:\\qiniu\\test.png
// String localFilePath = "D:\\image\\1.jsp";
//默认不指定key的情况下,以文件内容的hash值作为文件名
key = file;
Auth auth = Auth.create("/", "/");
String upToken = auth.uploadToken("yaoyuan");
try {
Response response = uploadManager.put(newURL, key, upToken);
//解析上传成功的结果
DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
System.out.println(putRet.key);
System.out.println(putRet.hash);
} catch (QiniuException ex) {
Response r = ex.response;
System.err.println(r.toString());
try {
System.err.println(r.bodyString());
} catch (QiniuException ex2) {
//ignore
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
然后是这样的
提交之后,再注册
短信和email功能都集成在这里了,注册完成之后可以看一下list
图片都显示了。也可以用七牛云上的图片做链接存到数据库里,再扔给前端做页面,但是在jsp里我不会这样显示图片,就搁置了。
评论