JRT文件服务实现

网站与客户端打印和导出方面已经无大碍了,今天抽时间整整文件服务,文件服务设计可以查看下面连接。原理一样,代码会有些变化。
文件服务设计

在这里插入图片描述

在这里插入图片描述

首先实现文件服务的服务端,就是一个业务脚本,用来接收上传、移动和删除文件请求,老的是Webservice:

import JRT.Core.MultiPlatform.JRTContext;
import JRT.Core.Util.ReflectUtil;
import JRTBLLBase.BaseHttpHandlerNoSession;
import JRTBLLBase.Helper;

import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.ArrayList;
import java.util.Base64;
import java.util.List;

/**
 * 上传文件服务,文件服务地址配站点的相对对象到/FileService
 */
public class JRTUpFileService extends BaseHttpHandlerNoSession {
    /**
     * 上传文件
     * fileBase64Str 文件的Base64串
     * fileName 文件名称
     * remotePath 相对路径,基于网站根目录下的FileService文件夹
     *
     * @return
     */
    public String Upload() {
        String fileBase64Str = Helper.ValidParam(JRTContext.GetRequest(Request, "fileBase64Str"), "");
        String fileName = Helper.ValidParam(JRTContext.GetRequest(Request, "fileName"), "");
        String remotePath = Helper.ValidParam(JRTContext.GetRequest(Request, "remotePath"), "");
        try {
            //根路径
            String rootPath = Paths.get(JRTContext.WebBasePath, "FileService").toString();
            File dir = new File(rootPath);
            //创建根目录
            if (!dir.exists()) {
                dir.mkdir();
            }
            //目录不存在就创建
            String pathAdd = rootPath;
            if (remotePath != "") {
                String[] remoteArr = remotePath.split("/");
                for (int i = 0; i < remoteArr.length; i++) {
                    if (remoteArr[i] == "") {
                        continue;
                    }
                    pathAdd = Paths.get(pathAdd, remoteArr[i]).toString();
                    String curPath = pathAdd;
                    File dirCur = new File(curPath);
                    //创建根目录
                    if (!dirCur.exists()) {
                        dirCur.mkdir();
                    }
                }
            }
            pathAdd = Paths.get(pathAdd, fileName).toString();
            //文件保存全路径
            String fileFullName = pathAdd;
            byte[] arr = Base64.getDecoder().decode(fileBase64Str);
            File fileSave = new File(fileFullName);
            if (fileSave.exists()) {
                fileSave.delete();
            }
            Files.write(Paths.get(fileFullName), arr, StandardOpenOption.CREATE_NEW);
            //返回结果
            return "";
        } catch (Exception ex) {
            System.out.println("保存异常:" + ex.getMessage());
            return ex.getMessage();
        }
    }


    /**
     * 移动文件
     * currentFilename 当前全路径
     * newFilename 新的全路径
     *
     * @return
     */
    public String ReName() {
        String currentFilename = Helper.ValidParam(JRTContext.GetRequest(Request, "currentFilename"), "");
        String newFilename = Helper.ValidParam(JRTContext.GetRequest(Request, "newFilename"), "");
        try {
            currentFilename = currentFilename.replace('\\', '/');
            newFilename = newFilename.replace('\\', '/');
            //根路径
            String rootPath = Paths.get(JRTContext.WebBasePath, "FileService").toString();
            currentFilename = currentFilename.replace("/FileService", "" + (char) 0);
            currentFilename = currentFilename.split((char) 0 + "")[1];
            String[] curArr = currentFilename.split("/");
            currentFilename = Combine(curArr);
            newFilename = newFilename.replace("/FileService", "" + (char) 0);
            newFilename = newFilename.split((char) 0 + "")[1];
            String[] newArr = newFilename.split("/");
            newFilename = Combine(newArr);

            String curFileFullName = Paths.get(rootPath, currentFilename).toString();
            String newFileFullName = Paths.get(rootPath, newFilename).toString();
            //尝试创建目录
            List<String> remoteAddList = new ArrayList<>();
            remoteAddList.add(rootPath);
            if (newFilename != "") {
                for (int i = 0; i < newArr.length - 1; i++) {
                    if (newArr[i] == "") {
                        continue;
                    }
                    remoteAddList.add(newArr[i]);
                    String curPath = Combine(remoteAddList);
                    File dirCur = new File(curPath);
                    //创建根目录
                    if (!dirCur.exists()) {
                        dirCur.mkdir();
                    }
                }
            }
            File fileMove = new File(curFileFullName);
            if (fileMove.exists()) {
                Files.move(Paths.get(curFileFullName), Paths.get(newFileFullName));
            } else {
                return "源文件不存在!" + curFileFullName;
            }
            //返回结果
            return "";
        } catch (Exception ex) {
            return ex.getMessage();
        }
    }

    /**
     * 删除文件
     * fileName:全路径
     *
     * @return
     */
    public String Delete() {
        String fileName = Helper.ValidParam(JRTContext.GetRequest(Request, "fileName"), "");
        try {
            fileName = fileName.replace('\\', '/');
            //根路径
            String rootPath = Paths.get(JRTContext.WebBasePath, "FileService").toString();
            fileName = fileName.replace("/FileService", "" + (char) 0);
            fileName = fileName.split((char) 0 + "")[1];
            String[] curArr = fileName.split("/");
            fileName = Combine(curArr);
            String curFileFullName = Paths.get(rootPath, fileName).toString();
            File fileDel = new File(curFileFullName);
            if (fileDel.exists()) {
                fileDel.delete();
            } else {
                return "删除文件不存在!" + curFileFullName;
            }
            //返回结果
            return "";
        } catch (Exception ex) {
            return ex.getMessage();
        }
    }

    /**
     * 合并路径
     *
     * @param arr
     * @return
     */
    private String Combine(String[] arr) {
        //获取系统路径分隔符
        String pathSeparator = System.getProperty("file.separator");
        // 使用 String.join() 方法将路径组件合并成一个路径字符串
        String pathString = String.join(pathSeparator, arr);
        return pathString;
    }

    /**
     * 合并路径
     *
     * @param arr
     * @return
     */
    private String Combine(List<String> arr) {
        //获取系统路径分隔符
        String pathSeparator = System.getProperty("file.separator");
        // 使用 String.join() 方法将路径组件合并成一个路径字符串
        String pathString = String.join(pathSeparator, arr);
        return pathString;
    }
}

对网站上传文件进行包装,抽取出FileCollection来表示页面提交的文件:

package JRT.Core.MultiPlatform;

import jakarta.servlet.http.Part;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class FileCollection
{
    /**
     * 存上传的文件对象
     */
    private Part file = null;

    /**
     * 上传文件对象初始化
     * @param part
     */
    public void InnerInit(Part part)
    {
        this.file = part;
    }

    /**
     * 获取文件名
     * @return
     * @throws Exception
     */
    public String GetFileName() throws Exception
    {
        if (file == null)
        {
            throw new Exception("未初始化文件对象!");
        }
        return file.getSubmittedFileName();
    }

    /**
     * 获取文件大小
     * @return
     * @throws Exception
     */
    public int GetLength() throws Exception
    {
        if (file == null)
        {
            throw new Exception("未初始化文件对象!");
        }
        return (int)file.getSize();
    }

    public InputStream GetInputStream() throws Exception
    {
        if (file == null)
        {
            throw new Exception("未初始化文件对象!");
        }
        return file.getInputStream();
    }

    /**
     * 保存文件到指定路径,绝对路径
     * @param abpath 保存文件的绝对路径,不可空
     * @param filename 新保存的文件名,如果为空则按原文件名保存
     * @throws Exception
     */
    public void Save2File(String abpath, String filename) throws Exception
    {
        if (abpath == null || abpath.isEmpty())
        {
            throw new Exception("需要传入保存文件的绝对目录");
        }
        Path filepath = Paths.get(abpath);
        //目录不存在的话就循环创建
        if (!filepath.toFile().exists())
        {
            String[] paths = abpath.replace("\\","/").split("/");
            Path allpath = null;
            for (var path : paths) {
                if (path.isEmpty()) continue;
                if (allpath == null) {
                    //Linux路径以/开始,所有补上
                    if (abpath.startsWith("/"))
                    {
                        allpath = Paths.get("/", path);
                    }
                    else
                    {
                        allpath = Paths.get(path);
                    }
                } else {
                    allpath = Paths.get(allpath.toString(), path);
                }
                //是目录,并且已经存在就不处理
                if (!allpath.toFile().exists())
                {
                    Files.createDirectory(allpath);
                }

            }
        }
        //如果不传入文件的话就以源文件名保存
        if (filename == null || filename.isEmpty())
        {
            filename = this.GetFileName();
        }
        File file = Paths.get(abpath, filename).toFile();
        FileOutputStream fileOutputStream = new FileOutputStream(file);
        this.GetInputStream().transferTo(fileOutputStream);
        fileOutputStream.flush();
        //释放资源
        fileOutputStream.close();
        this.GetInputStream().close();
    }

    /**
     * 保存文件到指定文件,文件可以不用先创建
     * @param filename 新保存的文件名
     * @throws Exception
     */
    public void Save2File(String filename) throws Exception
    {
        if (filename == null || filename.isEmpty())
        {
            throw new Exception("需要传入保存文件的绝对路径!");
        }
        Path filepath = Paths.get(filename);
        //目录不存在的话就循环创建
        if (!filepath.toFile().exists())
        {
            String[] paths = filename.replace("\\","/").split("/");
            Path allpath = null;
            for (int i = 0; i < paths.length - 1; i++)
            {
                String path = paths[i];
                if (path.isEmpty()) continue;
                if (allpath == null)
                {
                    //Linux路径以/开始,所有补上
                    if (filename.startsWith("/"))
                    {
                        allpath = Paths.get("/", path);
                    }
                    else
                    {
                        allpath = Paths.get(path);
                    }
                }
                else
                {
                    allpath = Paths.get(allpath.toString(), path);
                }
                //是目录,并且已经存在就不处理
                if (allpath.toFile().exists()) continue;
                Files.createDirectory(allpath);
            }
            //传入的最后一个路径为文件名
            allpath = Paths.get(allpath.toString(), paths[paths.length - 1]);
            if(!allpath.toFile().exists())
            {
                Files.createFile(allpath);
            }
        }
        FileOutputStream fileOutputStream = new FileOutputStream(filename);
        this.GetInputStream().transferTo(fileOutputStream);
        fileOutputStream.flush();
        //释放资源
        fileOutputStream.close();
        this.GetInputStream().close();
    }


    /**
     * 保存文件到默认路径
     * @throws Exception
     */
    public void Save2File() throws Exception
    {
        String basepath = JRT.Core.MultiPlatform.JRTContext.WebBasePath;
        Path path = Paths.get(basepath, "FileService");
        if (!path.toFile().exists())
        {
            Files.createDirectory(path);
        }
        Path file = Paths.get(path.toString(), this.GetFileName());
        FileOutputStream fileOutputStream = new FileOutputStream(file.toFile());
        this.GetInputStream().transferTo(fileOutputStream);
        fileOutputStream.flush();
        //释放资源
        fileOutputStream.close();
        this.GetInputStream().close();
    }
}

对获取前端提交文件包装,方便统一拦截上传类型等

package JRT.Core.MultiPlatform;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.Part;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import JRT.Core.MultiPlatform.FileCollection;

public class JRTWebFile
{
    /**
     * 获取http请求的文件流信息
     * @param request
     * @return
     */
    public static List<FileCollection> GetFiles(HttpServletRequest request)
    {
        List<FileCollection> fileList = new ArrayList<>();
        try
        {
            Collection<Part> parts = request.getParts();
            for (Part part : parts)
            {
                //取part名称
                String name = part.getName();
                //取part content-type
                String contenttype = part.getContentType();
                if (contenttype == null || contenttype.isEmpty())
                {
                    continue;
                }
                if (!name.toLowerCase().equals("file"))
                {
                    continue;
                }
                String filename = part.getSubmittedFileName();
                //获取文件名称
                if (filename == null || filename.isEmpty())
                {
                    continue;
                }
                FileCollection file = new FileCollection();
                file.InnerInit(part);
                fileList.add(file);
            }
        }
        catch (Exception ex)
        {
            System.out.println("获取http上传的文件异常!");
            ex.printStackTrace(System.out);
        }
        return fileList;
    }
}

包装文件服务操作接口,用来上传、下载、删除文件等

package JRT.Core.MultiPlatform;

import javax.net.ssl.*;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.security.cert.X509Certificate;
import java.util.Base64;
import java.util.stream.Stream;

/**
 * 文件服务操作类,通过此类上传和下载文件等
 */
public class FileService {
    /**
     * 上传文件到文件服务
     *
     * @param serverPath   服务地址,如果是FTP就是FTP带密码的地址,,如果是网站就是检验service/JRTUpFileService.ashx地址
     * @param fileFullName 文件带路径的全名
     * @param fileNewName  文件上传到服务器的新名称
     * @param remotePath   相对路径
     * @return 空成功,非空返回失败原因
     */
    public String Upload(String serverPath, String fileFullName, String fileNewName, String remotePath) throws Exception {
        try {
            String ret = "";
            //普通ftp模式
            if (serverPath.toLowerCase().contains("ftp://")) {
                throw new Exception("此版本不支持FTP上传");
            }
            //检验http模式
            else if (serverPath.toLowerCase().contains("http://") || serverPath.toLowerCase().contains("https://")) {
                String remote = GetFileServiceRemoteAddr(serverPath);
                remotePath = remote + remotePath;
                //文件得到Base64串
                String fileBase64 = File2Base64Str(fileFullName);
                File fi = new File(fileFullName);
                String fileName = fi.getName();
                //新名称
                if (fileNewName != "") {
                    fileName = fileNewName;
                }
                //组装Post
                String paraStr = "Method=Upload&fileBase64Str=" + UrlEnCode(fileBase64) + "&fileName=" + UrlEnCode(fileName) + "&remotePath=" + UrlEnCode(remotePath);
                String retStr = GetHttpStr(serverPath, paraStr);
                return retStr;
            }
            //sftp模式
            else {
                return "-1^不支持的文件服务模式!";
            }
        } catch (Exception ex) {
            return ex.getMessage();
        }
    }


    /**
     * 上传文件到文件服务
     *
     * @param serverPath  服务地址,如果是FTP就是FTP带密码的地址,,如果是网站就是检验service/JRTUpFileService.ashx地址
     * @param stream      文件流
     * @param fileNewName 文件上传到服务器的新名称
     * @param remotePath  相对路径
     * @return 空成功,非空返回失败原因
     */
    public String Upload(String serverPath, InputStream stream, String fileNewName, String remotePath) {
        try {
            String ret = "";
            //普通ftp模式
            if (serverPath.toLowerCase().contains("ftp://")) {
                throw new Exception("此版本不支持FTP上传");
            }
            //检验http模式
            else if (serverPath.toLowerCase().contains("http://") || serverPath.toLowerCase().contains("https://")) {
                //得到相对路径
                String remote = GetFileServiceRemoteAddr(serverPath);
                remotePath = remote + remotePath;
                //流得到Base64
                String fileBase64 = Stream2Base64Str(stream);
                String fileName = fileNewName;
                //组装Post
                String paraStr = "Method=Upload&fileBase64Str=" + UrlEnCode(fileBase64) + "&fileName=" + UrlEnCode(fileName) + "&remotePath=" + UrlEnCode(remotePath);
                String retStr = GetHttpStr(serverPath, paraStr);
                return retStr;
            }
            //sftp模式
            else {
                return "-1^不支持的文件服务模式!";
            }
        } catch (Exception ex) {
            return ex.getMessage();
        }
    }

    /**
     * 从服务下载文件
     *
     * @param fileServerFullPath 文件在服务的全路径
     * @param fileFullName       文件本地保存的全路径
     * @param passive
     * @return 成功返回空串,否则返回失败原因
     */
    public String Download(String fileServerFullPath, String fileFullName, boolean passive) {
        try {
            //普通ftp模式
            if (fileServerFullPath.toLowerCase().contains("ftp://")) {
                throw new Exception("此版本还不支持FTP");
            }
            //检验http模式
            else if (fileServerFullPath.toLowerCase().contains("http://") || fileServerFullPath.toLowerCase().contains("https://")) {
                //忽略证书
                if (fileServerFullPath.contains("https://")) {
                    TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {
                        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                            return null;
                        }

                        public void checkClientTrusted(X509Certificate[] certs, String authType) {
                        }

                        public void checkServerTrusted(X509Certificate[] certs, String authType) {
                        }
                    }
                    };
                    // Install the all-trusting trust manager
                    SSLContext sc = SSLContext.getInstance("SSL");
                    sc.init(null, trustAllCerts, new java.security.SecureRandom());
                    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
                    // Create all-trusting host name verifier
                    HostnameVerifier allHostsValid = new HostnameVerifier() {
                        public boolean verify(String hostname, SSLSession session) {
                            return true;
                        }
                    };
                }
                InputStream responseStream = null;
                FileOutputStream fileOutputStream = null;
                try {
                    URL u = new URL(UrlEnCode(fileServerFullPath));
                    HttpURLConnection http = (HttpURLConnection) u.openConnection();
                    http.setDoOutput(Boolean.TRUE);
                    http.setRequestMethod("GET");
                    int responseCode = http.getResponseCode();
                    responseStream = http.getInputStream();
                    Path fileFullNameP = Paths.get(fileFullName);
                    Path directoryName = fileFullNameP.getParent();
                    //本地路径不存在就创建
                    if (!Files.exists(directoryName)) {
                        Files.createDirectories(directoryName);
                    }
                    //文件存在就删除
                    if (Files.exists(fileFullNameP)) {
                        Files.delete(fileFullNameP);
                    }
                    fileOutputStream = new FileOutputStream(fileFullName);
                    // 创建一个byte数组来缓存读取的数据
                    byte[] buffer = new byte[1024];
                    int bytesRead;
                    // 读取InputStream中的数据,并将其写入到文件中
                    while ((bytesRead = responseStream.read(buffer)) != -1) {
                        fileOutputStream.write(buffer, 0, bytesRead);
                    }

                    return "";
                } catch (Exception ee) {
                    return ee.getMessage();
                } finally {
                    if (responseStream != null) {
                        responseStream.close();
                    }
                    if (fileOutputStream != null) {
                        fileOutputStream.close();
                    }
                }
            }
        } catch (Exception ex) {
            return ex.getMessage();
        }
        return "";
    }

    /**
     * 从服务下载文件
     *
     * @param fileServerFullPath 文件在服务的全路径
     * @param passive
     * @return
     */
    public InputStream DownloadStream(String fileServerFullPath, boolean passive) throws Exception {
        try {
            //普通ftp模式
            if (fileServerFullPath.toLowerCase().contains("ftp://")) {
                throw new Exception("此版本还不支持FTP");
            }
            //检验http模式
            else if (fileServerFullPath.toLowerCase().contains("http://") || fileServerFullPath.toLowerCase().contains("https://")) {
                //忽略证书
                if (fileServerFullPath.contains("https://")) {
                    TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {
                        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                            return null;
                        }

                        public void checkClientTrusted(X509Certificate[] certs, String authType) {
                        }

                        public void checkServerTrusted(X509Certificate[] certs, String authType) {
                        }
                    }
                    };
                    // Install the all-trusting trust manager
                    SSLContext sc = SSLContext.getInstance("SSL");
                    sc.init(null, trustAllCerts, new java.security.SecureRandom());
                    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
                    // Create all-trusting host name verifier
                    HostnameVerifier allHostsValid = new HostnameVerifier() {
                        public boolean verify(String hostname, SSLSession session) {
                            return true;
                        }
                    };
                }
                URL u = new URL(UrlEnCode(fileServerFullPath));
                HttpURLConnection http = (HttpURLConnection) u.openConnection();
                http.setDoOutput(Boolean.TRUE);
                http.setRequestMethod("GET");
                int responseCode = http.getResponseCode();
                InputStream responseStream = http.getInputStream();
                return responseStream;
            }
        } catch (Exception ex) {
            throw ex;
        }
        return null;
    }


    /**
     * 修改文件名
     *
     * @param serverPath      服务地址,如果是FTP就是FTP带密码的地址,,如果是网站就是检验service/JRTUpFileService.ashx地址
     * @param currentFilename 当前文件名
     * @param newFilename     修改的文件名
     * @param remotePath      相对路径
     * @return 成功返回空串,否则返回原因
     */
    public String ReName(String serverPath, String currentFilename, String newFilename, String remotePath) {
        try {
            //普通ftp模式
            if (serverPath.toLowerCase().contains("ftp://")) {
                throw new Exception("此版本还不支持FTP");
            }
            //检验http模式
            else if (serverPath.toLowerCase().contains("http://") || serverPath.toLowerCase().contains("https://")) {
                String paraStr = "Method=ReName&currentFilename=" + UrlEnCode(serverPath + remotePath + currentFilename) + "&newFilename=" + UrlEnCode(serverPath + remotePath + newFilename);
                String retStr = GetHttpStr(GetFileServiceAddr(serverPath), paraStr);
                return retStr;
            }
        } catch (Exception ex) {
            return ex.getMessage();
        }
        return "";
    }

    /**
     * 移动文件
     *
     * @param currentFullFilename 原文件全路径
     * @param newFullFilename     新的文件全路径
     * @return 成功返回空串,否则返回原因
     */
    public String Move(String currentFullFilename, String newFullFilename) {
        try {
            //普通ftp模式
            if (currentFullFilename.toLowerCase().contains("ftp://")) {
                throw new Exception("此版本还不支持FTP");
            }
            //检验http模式
            else if (currentFullFilename.toLowerCase().contains("http://") || currentFullFilename.toLowerCase().contains("https://")) {
                String paraStr = "Method=ReName&currentFilename=" + UrlEnCode(currentFullFilename) + "&newFilename=" + UrlEnCode(newFullFilename);
                String retStr = GetHttpStr(GetFileServiceAddr(currentFullFilename), paraStr);
                return retStr;
            }
        } catch (Exception ex) {
            return ex.getMessage();
        }
        return "";
    }


    /**
     * 删除服务器上的文件
     *
     * @param fileServerFullPath 文件在服务的全路径
     * @return 成功返回空串,否则返回原因
     */
    public String Delete(String fileServerFullPath) {
        try {
            //普通ftp模式
            if (fileServerFullPath.toLowerCase().contains("ftp://")) {
                throw new Exception("此版本还不支持FTP");
            }
            //检验http模式
            else if (fileServerFullPath.toLowerCase().contains("http://") || fileServerFullPath.toLowerCase().contains("https://")) {
                String paraStr = "Method=Delete&fileName=" + UrlEnCode(fileServerFullPath);
                String retStr = GetHttpStr(GetFileServiceAddr(fileServerFullPath), paraStr);
                return retStr;
            }
        } catch (Exception ex) {
            return ex.getMessage();
        }
        return "";
    }


    /**
     * 文件路径的文件得到Base64串
     *
     * @param path 全路径
     * @return
     * @throws Exception
     */
    public static String File2Base64Str(String path) throws Exception {
        File file = new File(path);
        if (!file.exists()) {
            return "";
        }
        try (FileInputStream fis = new FileInputStream(file)) {
            byte[] buffer = new byte[(int) file.length()];
            fis.read(buffer);
            fis.close();
            ;
            return Base64.getEncoder().encodeToString(buffer);
        } catch (IOException e) {
            throw new RuntimeException("读文件异常:", e);
        }
    }

    /**
     * url编码
     *
     * @param url
     * @return
     * @throws Exception
     */
    private static String UrlEnCode(String url) throws Exception {
        String[] arr = url.split("/");
        String head = "";
        String left = "";
        for (int i = 0; i < arr.length; i++) {
            if (i < 3) {
                if (head.isEmpty()) {
                    head = arr[i];
                } else {
                    head = head + "/" + arr[i];
                }
            } else {
                left = left + "/" + URLEncoder.encode(arr[i], "UTF-8");
            }
        }
        return head + left;

    }

    /**
     * 通过服务地址得到相对服务地址
     *
     * @param serverPath 服务地址
     * @return 相对服务地址
     */
    private String GetFileServiceRemoteAddr(String serverPath) {
        String[] arr = serverPath.split("/");
        StringBuilder ret = new StringBuilder();
        boolean start = false;
        for (int i = 0; i < arr.length; i++) {
            if (arr[i].toLowerCase().equals("fileservice")) {
                start = true;
                continue;
            }
            if (start == true) {
                ret.append(arr[i]).append("/");
            }
        }
        return ret.toString();
    }

    /**
     * 流转Base64
     *
     * @param stream 流
     * @return Base64串
     * @throws IOException
     */
    public static String Stream2Base64Str(InputStream stream) throws IOException {
        byte[] buffer = new byte[stream.available()];
        stream.read(buffer);
        String encoded = Base64.getEncoder().encodeToString(buffer);
        return encoded;
    }

    /**
     * 从http下载文本
     *
     * @param url  url
     * @param para 参数
     * @return 文本串
     * @throws Exception
     */
    private static String GetHttpStr(String url, String para) throws Exception {
        byte[] bytes = para.getBytes("UTF-8");
        //忽略证书
        if (url.contains("https://")) {
            TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {
                public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                    return null;
                }

                public void checkClientTrusted(X509Certificate[] certs, String authType) {
                }

                public void checkServerTrusted(X509Certificate[] certs, String authType) {
                }
            }
            };

            // Install the all-trusting trust manager
            SSLContext sc = SSLContext.getInstance("SSL");
            sc.init(null, trustAllCerts, new java.security.SecureRandom());
            HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());

            // Create all-trusting host name verifier
            HostnameVerifier allHostsValid = new HostnameVerifier() {
                public boolean verify(String hostname, SSLSession session) {
                    return true;
                }
            };
        }

        URL u = new URL(url);
        HttpURLConnection http = (HttpURLConnection) u.openConnection();
        http.setAllowUserInteraction(true);
        http.setDoOutput(Boolean.TRUE);
        http.setDoInput(Boolean.TRUE);
        http.setUseCaches(false);
        http.setRequestProperty("Content-type", "application/x-www-form-urlencoded");
        http.setInstanceFollowRedirects(false);
        http.setRequestMethod("POST");
        http.connect();

        OutputStream outputStream = http.getOutputStream();
        outputStream.write(bytes);
        outputStream.flush();
        outputStream.close();

        InputStream is = http.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        StringBuilder stringBuilder = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
            stringBuilder.append(line + System.lineSeparator());
        }
        return stringBuilder.toString();
    }

    /**
     * 通过服务地址得到webservice服务地址
     *
     * @param serverPath 服务地址
     * @return webservice服务地址
     */
    private String GetFileServiceAddr(String serverPath) {
        String[] arr = serverPath.split("/");
        StringBuilder webHead = new StringBuilder();
        for (int i = 0; i < arr.length; i++) {
            if (arr[i].toLowerCase().equals("fileservice")) {
                break;
            }
            webHead.append(arr[i]).append("/");
        }
        return webHead.toString() + "service/JRTUpFileService.ashx";
    }

}

测试文件操作后台代码

/**
	 * 上传文件到文件服务
	 * @return
	 */
	public String UpImageFile() throws Exception
	{
		//得到文件
		List<FileCollection> fileList=JRT.Core.MultiPlatform.JRTWebFile.GetFiles(Request);
		if(fileList!=null&&fileList.size()>0)
		{
			JRT.Core.MultiPlatform.FileService fileService=new JRT.Core.MultiPlatform.FileService();
			fileService.Upload("http://localhost:8080/JRTWeb/service/JRTUpFileService.ashx",fileList.get(0).GetInputStream(),fileList.get(0).GetFileName(),"/zlz");
		}
		return Helper.Success();
	}

	/**
	 * 改名文件
	 * @return
	 */
	public String ReNameImageFile() throws Exception
	{
		JRT.Core.MultiPlatform.FileService fileService=new JRT.Core.MultiPlatform.FileService();
		fileService.ReName("http://localhost:8080/JRTWeb/FileService/","logo.png","logo1.png","zlz/");
		return Helper.Success();
	}

	/**
	 * 删除文件
	 * @return
	 */
	public String DeleteImageFile() throws Exception
	{
		JRT.Core.MultiPlatform.FileService fileService=new JRT.Core.MultiPlatform.FileService();
		fileService.Delete("http://localhost:8080/JRTWeb/FileService/zlz/logo.png");
		fileService.Delete("http://localhost:8080/JRTWeb/FileService/zlz/logo1.png");
		return Helper.Success();
	}

前台代码

//上传文件到文件服务
            $("#btnUpfileBTTestCode").click(function () {
                $("#file_upload").click();
            });
            //改名文件
            $("#btnRenamefileBTTestCode").click(function () {
                //往后台提交数据
                $.ajax({
                    type: "post",
                    dataType: "json",
                    cache: false, //
                    async: true, //为true时,异步,不等待后台返回值,为false时强制等待;-asir
                    url: me.actionUrl + '?Method=ReNameImageFile',
                    success: function (data, status) {
                        $.messager.progress('close');
                        if (!FilterBackData(data)) {
                            return;
                        }
                        alert("成功");
                    }
                });
            });
            //删除文件
            $("#btnDeletefileBTTestCode").click(function () {
                //往后台提交数据
                $.ajax({
                    type: "post",
                    dataType: "json",
                    cache: false, //
                    async: true, //为true时,异步,不等待后台返回值,为false时强制等待;-asir
                    url: me.actionUrl + '?Method=DeleteImageFile',
                    success: function (data, status) {
                        $.messager.progress('close');
                        if (!FilterBackData(data)) {
                            return;
                        }
                        alert("成功");
                    }
                });
            });



//上传方法(HTML5)
        function http(date, url, callback) {
            function createXHttpRequest() {
                if (window.ActiveXObject) {
                    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
                }
                else if (window.XMLHttpRequest) {
                    xmlhttp = new XMLHttpRequest();
                }
                else {
                    return;
                }
            }
            function starRequest(date) {
                createXHttpRequest();
                xmlhttp.onreadystatechange = function (e) {
                    if (xmlhttp.readyState == 4) {
                        if (xmlhttp.status == 200) {
                            if (e.srcElement.response.indexOf("false") > -1) {
                                showError(e.srcElement.response);
                                return;
                            }
                            callback(xmlhttp.response);
                        }
                    }
                };
                xmlhttp.open("POST", url, false);
                xmlhttp.send(date);
            }
            starRequest(date);
        }


        //上传文件
        function UpFileDo(a, ftp) {
            var selectFiles = document.getElementById('file_upload').files;
            if (selectFiles != null && selectFiles.length > 0) {
                for (var i = 0; i < selectFiles.length; i++) {
                    var data = new FormData();
                    var file = selectFiles[i];
                    if (ftp == null) {
                        ftp = "";
                    }
                    data.append("file", file);
                    ajaxLoading();
                    setTimeout(function () {
                        ajaxLoadEnd();
                    }, 4000);
                    var url = me.actionUrl + "?Method=UpImageFile";
                    var callback = function (retData) {
                        retData = JSON.parse(retData);
                        if (retData.IsOk) {
                            alert("上传成功");
                        }
                        else {
                            showError(retData["Message"]);
                        }
                        ajaxLoadEnd();
                    };
                    http(data, url, callback);
                }
                $("#file_upload").val("");
            }
        }

这样之后每个运行的网站内部都自带文件服务,方便开发测试文件服务相关功能,正式部署也不用额外弄文件服务了,如果用sftp之类的还得额外搭建和学习,前端加载还得特殊处理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/233696.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Qt之基于QMediaPlayer的音视频播放器(支持常见音视频格式)

Qt自带了一个Media Player的例子,如下图所示: 但是运行这个例子机会发现,连最基本的MP4格式视频都播放不了。因为QMediaPlayer是个壳(也可以叫框架),依赖本地解码器,视频这块默认基本上就播放个MP4,甚至连MP4都不能播放,如果要支持其他格式需要下载k-lite或者LAVFilte…

Qt槽函数不响应不执行的一种原因:ui提升导致重名

背景&#xff1a; 一个包含了组件提升的ui&#xff0c;有个按钮的槽函数就是不响应&#xff0c;于是找原因。 分析&#xff1a; 槽函数的对应一是通过connect函数绑定信号&#xff0c;二是on_XXX_signal的命名方式。界面上部件的槽函数通常是第二种。 我反复确认细节&#…

cache教程 4.一致性哈希(hash)

本章节是单节点走向分布式节点的一个重要部分。 一致性哈希(consistent hashing)的原理以及为什么要使用一致性哈希。实现一致性哈希代码&#xff0c;添加相应的测试用例 1.多节点部署遇到的问题 上一章节完成了一个单节点的缓存服务器。那对于一个单节点来说&#xff0c;读…

L1-031:到底是不是太胖了

题目描述 据说一个人的标准体重应该是其身高&#xff08;单位&#xff1a;厘米&#xff09;减去100、再乘以0.9所得到的公斤数。真实体重与标准体重误差在10%以内都是完美身材&#xff08;即 | 真实体重 − 标准体重 | < 标准体重10%&#xff09;。已知 1 公斤等于 2 市斤。…

CSS入门(样式表|class类|选择器|背景|!important|文本颜色|字体|注释)

为什么学习CSS&#xff0c;因为QSS vs CSS 相似度极高&#xff0c;学好CSS对于QSS和QML都有潜移默化的作用。记住不管学习什么&#xff0c;我们都在围绕Qt集成。 入门 介绍 CSS 功能丰富&#xff0c;不仅仅是布局页面 外部样式表 <link> 在给定的HTML代码中&#xff…

文章解读与仿真程序复现思路——电力系统自动化EI\CSCD\北大核心《考虑移动式储能调度的配电网灾后多源协同孤岛运行策略》

这篇文章的标题表明研究的主题是在配电网发生灾害后&#xff0c;采用一种策略来实现多源协同孤岛运行&#xff0c;并在这个过程中特别考虑了移动式储能的调度。 让我们逐步解读标题的关键词&#xff1a; 考虑移动式储能调度&#xff1a; 文章关注的焦点之一是移动式储能系统的…

neuq-acm预备队训练week 8 P4779 【模板】单源最短路径(标准版)

题目背景 题目限制 题目描述 给定一个 n 个点&#xff0c;m 条有向边的带非负权图&#xff0c;请你计算从 s 出发&#xff0c;到每个点的距离。 数据保证你能从 s 出发到任意点。 输入格式 第一行为三个正整数n,m,s。 第二行起 m 行&#xff0c;每行三个非负整数 ui​,vi​…

2023年【广东省安全员C证第四批(专职安全生产管理人员)】考试总结及广东省安全员C证第四批(专职安全生产管理人员)复审考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年【广东省安全员C证第四批&#xff08;专职安全生产管理人员&#xff09;】考试总结及广东省安全员C证第四批&#xff08;专职安全生产管理人员&#xff09;复审考试&#xff0c;包含广东省安全员C证第四批&…

File has been changed outside the editor, reload?

编译keil工程&#xff0c;一直提示&#xff1a;该文件在编译器之外被修改&#xff0c;是否重新加载。 解决办法&#xff1a; 关闭.map后缀的文件即可&#xff0c;然后重新build/rebulid可以发现不会重新弹出该错误。

完整方案开放下载!详解中国移动《通信网络中量子计算应用研究报告》

8月30日&#xff0c;中国移动在第四届科技周暨战略性新兴产业共创发展大会上重磅发布了《通信网络中量子计算应用研究报告》。 玻色量子作为中国移动在光量子计算领域的唯一一家合作企业兼战投企业&#xff0c;在量子计算应用于通信行业达成了深入合作&#xff0c;并在5G天线多…

Docker部署redis单节点

【百炼成魔】docker部署redis单节点 环境准备 关闭防火墙 systemctl stop firewalld && systemctl disable firewalldsetenforce 0 && sed -i s/SELINUX.*/SELINUXdisabled/g /etc/selinux/config安装常用软件 yum install -y wget net-tools bash-compl…

[Linux] 用LNMP网站框架搭建论坛

一、nginx在其中工作原理 原理&#xff1a; php-fpm.conf是控制php-fpm守护进程 它是php.ini是一个php解析器 工作过程&#xff1a; 1.当客户端通过域名请求访问时&#xff0c;Nginx会找到对应的虚拟主机 2. Nginx将确定请求。 对于静态请求&#xff0c;Nginx会自行处理…

C++-引用和指针区别

文章目录 1.变量的组成2.指针2.1 定义2.2 使用指针操作变量2.3 为什么使用指针 3.引用3.1 定义3.2 引用注意事项 4.引用和指针的区别 1.变量的组成 变量的组成&#xff1a;变量地址&#xff0c;变量名&#xff0c;变量值 例&#xff1a; int i 12;2.指针 2.1 定义 指针用于存…

高效利用内存资源之动态内存管理详解

目录 一、为什么存在动态内存分配 二、动态内存函数的介绍 2.1malloc 2.2free 2.3calloc 2.4realloc 三、常见的动态内存错误 3.1对NULL指针的解引用操作 3.2对动态开辟空间的越界访问 3.3对非动态开辟内存使用free释放 3.4使用free释放一块动态开辟内存的一部分 3.…

普冉(PUYA)单片机开发笔记(7): ADC-轮询式多路采样

概述 应用中经常会有使用单片机进行模数转换的需求。PY32F003 具有 1 个 12 位的模拟数字转换器&#xff08;ADC&#xff09;&#xff0c;今天我们一起来使用一下这个 ADC。 数据手册中对 ADC 简介如下。 SAR ADC&#xff1a;逐次逼近式 ADC&#xff0c;原理参见“参考链接&a…

Weblogic-wls-wsat-unserialize_CVE-2017-10271

文章目录 Weblogic < 10.3.6 wls-wsat XMLDecoder 反序列化漏洞1. 漏洞描述2. 漏洞复现2.1 环境启动2.2 漏洞扫描2.3 漏洞验证 3. 修复建议 Weblogic < 10.3.6 ‘wls-wsat’ XMLDecoder 反序列化漏洞 1. 漏洞描述 说明内容漏洞编号CVE-2017-10271漏洞名称Weblogic <…

手机搭建kali

kali是著名的黑客专用系统&#xff0c;一般都是直接装在物理机或者虚拟机上&#xff0c;我们可以尝试把kali安装在手机上&#xff0c;把手机打造成一个便携式渗透神器。 我们需要下载以下3款软件&#xff1a; (1).Termux(终端模拟器) (2).AnLinux(里边有各种安装liunx的命令…

[架构之路-261]:目标系统 - 设计方法 - 软件工程 - 软件设计 - 架构设计 - 网络数据交换格式

一、网络数据交换格式 1.1 什么是网络数据交换格式 网络数据交换格式指的是在计算机网络中传输和存储数据时所采用的特定格式。 它定义了数据的组织方式、结构和编码规则&#xff0c;以便不同系统和应用程序之间能够准确地解析和处理数据。 网络数据交换格式的主要目的是&a…

内存映射机制

什么是内存映射 Linux通过将一个虚拟内存区域与一个磁盘上的对象关联起来&#xff0c;以初始化这个虚拟区域的内如&#xff0c;这个过程称为内存映射。 代码示例&#xff1a; /******************************************************************** > File Name: mmap…

java--StringBuilder、StringBuffer、StringJoiner

1.StringBuilder ①StringBuilder代表可变字符串对象&#xff0c;相当于是一个容器&#xff0c;它里面装的字符串是可以改变的&#xff0c;就是用来操作字符串的。 ②好处&#xff1a;StringBuilder比String更适合做字符串的修改操作&#xff0c;效率会比更高&#xff0c;代码…