实际开发情景中,有时会遇到文件需要从一台服务器发到另一台服务器的情况,比如外网发到内网,服务器之间文件同步的情况。
就可以用文件转发。
转发端代码:
/** * * @param fileName 保存文件名 * @param filePath 保存本地的文件路径 * @param url 目标服务器的地址 */ @SuppressWarnings("static-access") public void relay(String fileName,String filePath,String url){ url = url+"?name="+fileName +"&uploadDir="+uploadDir; //文件转发 byte[] buffer = this.File2byte(filePath); StringBuilder sb2 = null; String BOUNDARY = java.util.UUID.randomUUID().toString(); //String PREFIX = "--", LINEND = "\r\n"; String MULTIPART_FROM_DATA = "multipart/form-data"; URL uri = null; try { uri = new URL(url); HttpURLConnection conn= null; try { conn = (HttpURLConnection) uri.openConnection(); conn.setReadTimeout(60 * 1000); // 缓存的最长时间 conn.setDoInput(true);// 允许输入 conn.setDoOutput(true);// 允许输出 conn.setUseCaches(false); // 不允许使用缓存 conn.setRequestMethod("POST"); conn.setRequestProperty("connection", "keep-alive"); conn.setRequestProperty("Charsert", "UTF-8"); conn.setRequestProperty("Content-Type", MULTIPART_FROM_DATA + ";boundary=" + BOUNDARY); DataOutputStream outStream; outStream = new DataOutputStream(conn.getOutputStream()); InputStream in = null; // 发送文件数据 outStream.write(buffer); // 得到响应码 int res = conn.getResponseCode(); if (res == 200){ in = conn.getInputStream(); int ch; sb2 = new StringBuilder(); while ((ch = in.read()) != -1){ sb2.append((char) ch); } } outStream.close(); conn.disconnect(); } catch (IOException e1) { e1.printStackTrace(); } } catch (MalformedURLException e) { e.printStackTrace(); } }
接收端代码:
import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.centit.cmip.sdk.common.utils.DateUtil; /** * <p>转发文件接收<p> * @version 1.0 * @author li_hao * @date 2017年12月15日 */ @WebServlet("/receiveServlet") @SuppressWarnings("serial") public class ReceiveServlet extends HttpServlet{ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } public void doPost(HttpServletRequest request, HttpServletResponse response){ InputStream is = null; FileOutputStream outputStream = null; try { String fileName = request.getParameter("name"); String uploadDir = request.getParameter("uploadDir"); String storePath = "/resource/upload/" + DateUtil.current("yyyy-MM-dd")+"/" +fileName; String realFile = uploadDir + storePath; File file = new File(realFile); if (!file.getParentFile().exists()){ file.getParentFile().mkdirs(); } is = request.getInputStream(); outputStream = new FileOutputStream(file); writeIntoOut(is,outputStream); } catch (Exception e) { e.printStackTrace(); } finally { try { is.close(); outputStream.flush(); outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } private void writeIntoOut(InputStream ins, OutputStream out) { byte[] bb = new byte[10 * 1024]; try { int cnt = ins.read(bb); while (cnt > 0) { out.write(bb, 0, cnt); cnt = ins.read(bb); } } catch (IOException e) { e.printStackTrace(); } finally { try { ins.close(); out.close(); } catch (IOException e) { e.printStackTrace(); } } } }