• 用Java最简单的交换协议HttpExchange 构建HttpServer服务器,解析ResponseBody实现上传文件


    HBServer.java

    package Test;
    
    import java.io.IOException;
    import java.net.InetSocketAddress;
    import java.util.concurrent.Executors;
    
    import com.sun.net.httpserver.HttpServer;
    
    import Test.OpHandler;
    public class HBServer {
    
        public static void main( String[] args ){
            HttpServer httpServer;
            try {
                httpServer = HttpServer.create(new InetSocketAddress(16621), 0);
                httpServer.createContext("/op", new OpHandler());
                // 放到线程池里执行
                httpServer.setExecutor(Executors.newCachedThreadPool());
                httpServer.start();
            } catch (IOException e) { e.printStackTrace(); }
        }
    }

    OpHandler.java

     

    package Test;
    
    import java.io.IOException;
    
    
    import com.sun.net.httpserver.HttpExchange;
    import com.sun.net.httpserver.HttpHandler;
    
    // 支持运维/工程管理App相关的接口
    public class OpHandler implements HttpHandler {
    
        @Override
        public void handle(HttpExchange he) throws IOException {
    //        FileUploadUtil.fileUpload(he);
            FileUploadUtil.readRequestBody(he);
        }
    }

    FileUploadUtil.java

    package Test;
    
    import java.io.BufferedInputStream;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    
    import com.sun.net.httpserver.HttpExchange;
    
    import tar.TarOutputStream;
    
    public class FileUploadUtil {
    
        private FileUploadUtil(){};
        public static class RequestFileItem{
            public String fileName;
            public String boundary;
            public String countentType;
        }
        public static class RequestBody{
            public static String boundary;
            public static List<Map<String,String>> formItems = new ArrayList<>();
            public static List<Map<String, File>> fileItems = new ArrayList<>();
        }private static RequestFileItem info;
        public static void fileUpload(HttpExchange he){
            try{
                InputStream is = he.getRequestBody();
                BufferedInputStream bis = new BufferedInputStream(is);
                byte[] buffer = new byte[1024];//前三行一定小于1024个byte
                int length = 0;
                File file;
                OutputStream os = null;
                boolean isStart = true;
                while((length = bis.read(buffer)) != -1 ){
                    //判断是不是文件的分隔符,不是的话,读到临时文件中
                    //正常写入
                    if( isStart ) {
                        int startReadIndex =getFileReadIndex(buffer);
                        isStart = false;
                        if(info != null && info.fileName != null){
                            file = new File("F://temp/" + info.fileName);
                            if( !file.exists() ) file.createNewFile();
                            os = new FileOutputStream(file);
                            byte[] realData = cartByte(buffer, startReadIndex, buffer.length - startReadIndex);
                            if(new String(realData).contains("-")){
                                //文件非常小,第一个1024字节就包含了文件
                                realData = cartByte(realData, 0, getIndexOf(realData, "-".getBytes()) - "
    -".getBytes().length);
                                os.write(realData);
                                os.close();
                                break;
                            }
                            os.write(buffer, startReadIndex, buffer.length - startReadIndex);
                            continue;
                        }
                    }
                    if(os == null) break;
                    //如果包含结束符,则只读结束符以前的数据
                    if( !new String(buffer).contains(info.boundary) ){
                        os.write(buffer, 0, length);
                    }else{
                        //结束符前有个换行符,所以减2
                        buffer = cartByte(buffer, 0, GetIndexOf(buffer, (info.boundary).getBytes()) - 2);
                        os.write( buffer, 0, buffer.length - 1);
                        os.close();
                        break;
                    }
                }
            }catch(Exception e){ e.printStackTrace(); }
        }
        private static int getFileReadIndex(byte[] buffer) {
            //读四个
    符号就检查是不是文件
            try{
                for( int i=0;i<buffer.length; i++){
                    int startIndex = getLineIndex(buffer, 4 * i);
                    int endIndex = getLineIndex(buffer, 4 * (i+1));
                    byte[] fourLines = cartByte(buffer, startIndex, endIndex);
                    if(isFileBoundary(fourLines))
                        return endIndex;
                }
            }catch(Exception e){ System.out.println("出现异常:" + e.getMessage()); }
            return 0;
        }
    
        private static boolean isFileBoundary(byte[] buffer){
            String fileItem = new String(buffer);
            if(fileItem.contains("filename")) {
                if(info == null) info = new RequestFileItem();
                info.boundary  = fileItem.substring(0,fileItem.indexOf("
    ") - 1);
                fileItem = fileItem.substring(fileItem.indexOf("
    ") + 1,fileItem.length());
                info.fileName = fileItem.substring(fileItem.indexOf("filename="") + "filename="".length(), fileItem.indexOf("
    ") - ""
    ".length());
                info.countentType = fileItem.substring(fileItem.indexOf("Content-Type:"),fileItem.length());
                return true;
            }
            return false;
        }
        public static int getLineIndex(byte[] source,int lineNumber){
            if(lineNumber <= 0) return 0;
            int lineCount = 0;
            for( int k = 0;k < source.length;k++){
                if( lineCount == lineNumber )
                    return k;
                if( source[k] == "
    ".getBytes()[0] && lineCount  <= lineNumber)
                    lineCount ++;
            }
            return 0;
        }
        /**
         * 获取byte[]指定起始位置的数组
         * @param source
         * @param begin
         * @param end
         * @return
         */
        public static byte[] cartByte(byte[] source,int beginIndex,int endIndex){
            if(source == null || source.length <= 0 || endIndex - beginIndex <= 0) return null;
            int byteLength = (endIndex + 1) - beginIndex;
            byte[] temp = new byte[ byteLength ];
            for( int i = 0; i < byteLength; i++ ){ temp[i] = source[i + beginIndex]; }
            return temp;
        }
        
        /**
         * 获取某串byte数组在原byte数组的位置
         * @param source 原byte数组
         * @param part 某串byte数组
         * @return -1 未找到  其他大于等于0的值
         */
        public static int getIndexOf(byte[] source ,byte[] part){
             if (source == null || part == null || source.length == 0 || part.length == 0)
                 return -1;
            int i,j;
             for(i=0;i<source.length;i++){
                 if(source[i] == part[0]){
                     for(j=0;j<part.length;j++)
                         if(source[i+j] != part[j]) break;
                     if(j == part.length) return i;
                 }
             }
             return -1;
        }
        /**
         * 获取某串byte数组在原byte数组的位置
         * @param source 原byte数组
         * @param part 某串byte数组
         * @return -1 未找到  其他大于等于0的值
         */
         public  static int GetIndexOf(byte[] source, byte[] part)
         {
             if (source == null || part == null || source.length == 0 || part.length == 0)
                 return -1;
    
             int i, j;
             for (i = 0; i < source.length; i++)
             {
                 if (source[i] == part[0])
                 {
                     for (j = 1; j < part.length; j++)
                     {
                         if (source[i + j] != part[j])
                             break;
                     }
                     if (j == part.length)
                         return i;
                 }
             }
             return -1;
         }
         
         public static void compressedFiles_Gzip(String folderPath, String   targzipFilePath, String targzipFileName){
             File file = new File(folderPath);
             if( !file.exists() || !file.isDirectory() || file.listFiles().length <= 0 ) return;
             File[] childFiles = file.listFiles();
             try{
                 //建立文件输出流
                 OutputStream os = new FileOutputStream(targzipFilePath);
                 //建立tar 压缩输出流
                 TarOutputStream tos = new TarOutputStream(os);
                 for(int i=0;i<childFiles.length;i++){
                     
                 }
             }catch(Exception e){
                 
             }
         }
    }
  • 相关阅读:
    页码数求0到9共有多少个
    reduce
    map,filter
    匿名函数 lambda
    递归
    python 切片
    函数
    集合(set)
    python 中random 库的使用
    printf 输出?
  • 原文地址:https://www.cnblogs.com/LoveHe/p/Jerry.html
Copyright © 2020-2023  润新知