1. 程式人生 > >android OkHttp上傳檔案,selvelt服務端

android OkHttp上傳檔案,selvelt服務端

最近專案需要一個檔案上傳的功能,之前服務端都是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;
	}
}