漂流的老妖怪

导航

 

  实际开发情景中,有时会遇到文件需要从一台服务器发到另一台服务器的情况,比如外网发到内网,服务器之间文件同步的情况。

  就可以用文件转发。

  转发端代码:

/**
     * 
     * @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();
            }

        }
    }
}

 

posted on 2017-12-15 10:25  漂流的老妖怪  阅读(2140)  评论(0编辑  收藏  举报