最近项目需要一个文件上传的功能,之前服务端都是uploadFile第三方库去做,但是时常会有文件上传失败的请求(没办法上传失败就让用户再上传一次吧)。
但近日看了大牛鸿洋_的博客 http://blog.csdn.net/lmj623565791/article/details/47911083 Android OkHttp完全解析 是时候来了解OkHttp了
废弃了自己的数据请求的工具类,用了鸿洋封装过的OkHttp确实方便了很多,但是上传文件时好像不兼容selvet+uploadFile,想着反正原先的上传接口就有问题那就全换了吧
1.环境 Tomcat 7.0+
2. selvet3.0,网上怎么配置都有
以下代码,根据自己需求去改:
package com.farsunset.ichat.admin.action;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import com.farsunset.cim.nio.mutual.Message;
import com.farsunset.cim.nio.session.CIMSession;
import com.farsunset.cim.nio.session.DefaultSessionManager;
import com.farsunset.ichat.cim.dao.hibernate.MessageDaoHibernate;
import com.farsunset.ichat.cim.generator.MessageGenerator;
import com.farsunset.ichat.common.util.ContextHolder;
import com.farsunset.ichat.common.util.FileUtils;
import com.farsunset.ichat.common.util.ImageUtil;
@WebServlet(name = "ChatMessageServlet", urlPatterns = "/ChatMessageServlet")
@MultipartConfig
public class ChatMessageServlet extends HttpServlet {
private String dir = null;
private File folderFile = null;
private ImageUtil imageUtil = null;
private MessageDaoHibernate messageDaoHibernate;
private DefaultSessionManager sessionManager;
private MessageGenerator messageGenerator;
/**
* @see HttpServlet#HttpServlet()
*/
public ChatMessageServlet() {
messageDaoHibernate = (MessageDaoHibernate) ContextHolder
.getBean("messageDaoHibernate");
sessionManager = DefaultSessionManager.getInstance();
messageGenerator = new MessageGenerator();
}
/**
*
* @see Servlet#init(ServletConfig)
*/
public void init(ServletConfig config) throws ServletException {
dir = config.getServletContext().getRealPath("Chat");
folderFile = new File(dir);
folderFile.mkdirs();
imageUtil = new ImageUtil();
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
String nowDateFormat = new SimpleDateFormat("yyyyMMdd")
.format(new Date());
String apath = dir + File.separator + nowDateFormat + File.separator;
// 参数处理
String sender = inputStream2String(req.getPart("sender")
.getInputStream());
String receiver = inputStream2String(req.getPart("receiver")
.getInputStream());
String uuid = inputStream2String(req.getPart("uuid").getInputStream());
String type = inputStream2String(req.getPart("type").getInputStream());
String title = inputStream2String(req.getPart("title").getInputStream());
String fileType = inputStream2String(req.getPart("fileType")
.getInputStream());
String format = inputStream2String(req.getPart("format")
.getInputStream());
// 获取上传的文件集合
Collection<Part> parts = req.getParts();
for (Part part : parts) {// 循环处理上传的文件
// 文件处理
if (part.getName().equals("image")) {
// 文件处理
String header = part.getHeader("content-disposition");
// 获取文件名
String filePath = apath + "image" + File.separator
+ getFileName(header);
FileUtils.createFile(filePath);
// 写入指定文件
part.write(filePath);
// 生成缩略图
imageUtil.thumbnailImage(filePath, 100, 150);
sentFileToUser(sender, receiver, uuid, type, title, fileType,
format, filePath);
} else if (part.getName().equals("voice")) {
// 文件处理
String header = part.getHeader("content-disposition");
// 获取文件名
String filePath = apath + "voice" + File.separator
+ getFileName(header);
FileUtils.createFile(filePath);
// 写入指定文件
part.write(filePath);
sentFileToUser(sender, receiver, uuid, type, title, fileType,
format, filePath);
}
}
}
private void sentFileToUser(String sender, String receiver, String uuid,
String type, String title, String fileType, String format,
String filePath) {
// 生成消息
Message msg = new Message();
msg.setFileUrl(filePath);
msg.setFileType(fileType);
msg.setFormat(format);
msg.setReceiver(receiver);
msg.setSender(sender);
msg.setTitle(title);
msg.setType(type);
msg.setUuid(uuid);
messageDaoHibernate.saveMessage(messageGenerator.toIMMessage(msg));
CIMSession session = sessionManager.getSession(receiver);
if (session != null && session.isConnected()) {
session.write(msg);
}
}
public String inputStream2String(InputStream in) throws IOException {
StringBuffer out = new StringBuffer();
byte[] b = new byte[1024];
for (int n; (n = in.read(b)) != -1;) {
out.append(new String(b, 0, n));
}
return out.toString();
}
public String getFileName(String header) {
String[] tempArr1 = header.split(";");
String[] tempArr2 = tempArr1[2].split("=");
String fileName = tempArr2[1].substring(
tempArr2[1].lastIndexOf("\\") + 1).replaceAll("\"", "");
return fileName;
}
}