精华内容
下载资源
问答
  • java上传文件到服务器

    热门讨论 2009-06-17 16:36:22
    java上传文件到服务器,将本地的文件上传到服务器上去
  • FastDFS通过java上传文件到服务器

    万次阅读 多人点赞 2018-08-10 17:39:18
    ... ... ...三、FastDFS使用流程...我们在项目中使用fastdfs+nginx+mysql实现上传附件的功能,主要原理就是将附件上传到fastdfs得到一个文件的链接路径url,我们获取这个url将他以字符串形式保存我们的mysql中,下...

    GitHub原文地址点击进入
    #一、FastDFS简介及系统环境搭建:点击进入
    #二、FastDFS 配置 Nginx 模块及访问测试:点击进入
    #三、FastDFS使用流程介绍:
    我们在项目中使用fastdfs+nginx+mysql实现上传附件的功能,主要原理就是将附件上传到fastdfs得到一个文件的链接路径url,我们获取到这个url将他以字符串形式保存到我们的mysql中,下载的时候获取到这个url直接打开或者下载附件
    这里写图片描述这里写图片描述
    #四、实现代码:
    1,配置依赖:因为我们使用的maven来管理工程,所以我们需要去添加pom文件依赖

    <!-- fastdfs -->
    <dependency>
    	<groupId>org.csource</groupId>
    	<artifactId>fastdfs-client-java</artifactId>
    	<version>1.27-SNAPSHOT</version>
    </dependency>
    <dependency>        
    	<groupId>commons-io</groupId>        
    	<artifactId>commons-io</artifactId>        
    	<version>2.4</version>    
    </dependency>
    

    注意:由于fastdfs-client-java jar包没有上传到中央仓库,所以需要下载源码进行maven编译再上传到私服,然后通过私服下载,具体流程参照步骤一,或者通过jar包的形式进行下载:
    下载地址:点击进入

    2,配置信息:我这里是配置在 application.properties 文件中的

    #FastDFS配置begin-----------除了fastdfs.tracker_servers,其它配置项都是可选的
    fastdfs.connect_timeout_in_seconds=5
    fastdfs.network_timeout_in_seconds=30
    fastdfs.charset=UTF-8
    fastdfs.http_anti_steal_token=false
    fastdfs.http_secret_key=FastDFS1234567890
    fastdfs.http_tracker_http_port=8070
    fastdfs.tracker_servers=192.168.2.200:22122
    #FastDFS配置end-----------
    

    这里写图片描述
    3,具体实现代码:

    /**
      * 上传文件到FastDFS
      *
      * @param file
      */
     @RequestMapping(value = "/fastDFSUpload", method = RequestMethod.POST)
     @ResponseBody
     public void fastDFSUpload(MultipartFile file) {
    
         String ext_Name = file.getOriginalFilename().split("\\.")[1];
         String file_Name = file.getOriginalFilename().split("\\.")[0];
    
         byte[] bytes = null;
         try {
             bytes = file.getBytes();
         } catch (IOException e) {
             e.printStackTrace();
         }
    
         String filePath= uploadFile(bytes, ext_Name, file_Name);
     }
    
     /**
      * FastDFS实现文件下载
      *
      * @param filePath
      */
     @RequestMapping(value = "/fastDFSDownload", method = RequestMethod.GET)
     @ResponseBody
     public void fastDFSDownload(String filePath) {
         try {
             ClientGlobal.initByProperties("application.properties");
    
             // 链接FastDFS服务器,创建tracker和Stroage
             TrackerClient trackerClient = new TrackerClient();
             TrackerServer trackerServer = trackerClient.getConnection();
    
             String storageServerIp = getStorageServerIp(trackerClient, trackerServer);
             StorageServer storageServer = getStorageServer(storageServerIp);
             StorageClient storageClient = new StorageClient(trackerServer, storageServer);
             byte[] b = storageClient.download_file("group1", filePath);
             if (b == null) {
                 throw new IOException("文件" + filePath + "不存在");
             }
    
             String fileName = filePath.substring(filePath.lastIndexOf("/") + 1);
             FileOutputStream fileOutputStream = new FileOutputStream("c://" + fileName);
             IOUtils.write(b, fileOutputStream);
             fileOutputStream.close();
         } catch (Exception e) {
             e.printStackTrace();
         }
     }
    
     /**
      * FastDFS获取将上传文件信息
      */
     @RequestMapping(value = "/fastDFSGetFileInfo", method = RequestMethod.GET)
     @ResponseBody
     public void fastDFSGetFileInfo(String filePath) {
         try {
             // 链接FastDFS服务器,创建tracker和Stroage
             ClientGlobal.initByProperties("application.properties");
             TrackerClient trackerClient = new TrackerClient();
             TrackerServer trackerServer = trackerClient.getConnection();
    
             String storageServerIp = getStorageServerIp(trackerClient, trackerServer);
             StorageServer storageServer = getStorageServer(storageServerIp);
             StorageClient storageClient = new StorageClient(trackerServer, storageServer);
    
             FileInfo fi = storageClient.get_file_info("group1", filePath);
             if (fi == null) {
                 throw new IOException("文件" + filePath + "不存在");
             }
    
             log.debug("文件信息=" + fi.toString());
         } catch (Exception e) {
             e.printStackTrace();
         }
     }
    
     /**
      * FastDFS获取文件名称
      */
     @RequestMapping(value = "/fastDFSGetFileName", method = RequestMethod.GET)
     @ResponseBody
     public void fastDFSGetFileName(String filePath) {
         try {
             // 链接FastDFS服务器,创建tracker和Stroage
             ClientGlobal.initByProperties("application.properties");
             TrackerClient trackerClient = new TrackerClient();
             TrackerServer trackerServer = trackerClient.getConnection();
    
             String storageServerIp = getStorageServerIp(trackerClient, trackerServer);
             StorageServer storageServer = getStorageServer(storageServerIp);
             StorageClient storageClient = new StorageClient(trackerServer, storageServer);
    
             NameValuePair[] nvps = storageClient.get_metadata("group1", filePath);
             if (nvps == null) {
                 throw new IOException("文件" + filePath + "不存在");
             }
    
             log.debug(nvps[0].getName() + "." + nvps[0].getValue());
         } catch (Exception e) {
             e.printStackTrace();
         }
     }
    
     /**
      * FastDFS实现删除文件
      */
     @RequestMapping(value = "/fastDFSDelete", method = RequestMethod.GET)
     @ResponseBody
     public void fastDFSDelete(String filePath) {
         try {
             // 链接FastDFS服务器,创建tracker和Stroage
             ClientGlobal.initByProperties("application.properties");
             TrackerClient trackerClient = new TrackerClient();
             TrackerServer trackerServer = trackerClient.getConnection();
    
             String storageServerIp = getStorageServerIp(trackerClient, trackerServer);
             StorageServer storageServer = getStorageServer(storageServerIp);
             StorageClient storageClient = new StorageClient(trackerServer, storageServer);
    
             int i = storageClient.delete_file("group1", filePath);
             log.debug(i == 0 ? "删除成功" : "删除失败:" + i);
         } catch (Exception e) {
             e.printStackTrace();
         }
     }
    
     public String uploadFile(byte[] byteFile, String ext_file, String file_Name) {
    
         // 拼接服务区的文件路径
         StringBuffer sbPath = new StringBuffer();
         sbPath.append("http://192.168.2.200/uploads/");
         try {
             // 初始化文件资源
             ClientGlobal.initByProperties("application.properties");
    
             // 链接FastDFS服务器,创建tracker和Stroage
             TrackerClient trackerClient = new TrackerClient();
             TrackerServer trackerServer = trackerClient.getConnection();
    
             String storageServerIp = getStorageServerIp(trackerClient, trackerServer);
             StorageServer storageServer = getStorageServer(storageServerIp);
             StorageClient storageClient = new StorageClient(trackerServer, storageServer);
    
             //利用字节流上传文件
    //            NameValuePair[] nvps = new NameValuePair[1];
    //            nvps[0] = new NameValuePair(file_Name, ext_file);
             String[] strings = storageClient.upload_file(byteFile, ext_file, null);
    
             sbPath.append(StrUtil.join("/", strings));
             log.debug("上传路径=" + sbPath.toString());
         } catch (IOException | MyException e) {
             e.printStackTrace();
         }
         return sbPath.toString();
     }
    
     /**
      * 得到Storage服务
      *
      * @param storageIp
      * @return 返回Storage服务
      */
     private static StorageServer getStorageServer(String storageIp) {
         StorageServer storageServer = null;
         if (storageIp != null && !("").equals(storageIp)) {
             try {
                 // ip port store_path下标
                 storageServer = new StorageServer(storageIp, 23000, 1);
             } catch (IOException e) {
                 e.printStackTrace();
             }
         }
         log.debug("——storage server生成");
         return storageServer;
     }
    
     /**
      * 获得可用的storage IP
      *
      * @param trackerClient
      * @param trackerServer
      * @return 返回storage IP
      */
     private static String getStorageServerIp(TrackerClient trackerClient, TrackerServer trackerServer) {
         String storageIp = null;
         if (trackerClient != null && trackerServer != null) {
             try {
                 StorageServer storageServer = trackerClient.getStoreStorage(trackerServer, "group1");
                 storageIp = storageServer.getSocket().getInetAddress().getHostAddress();
             } catch (IOException e) {
                 e.printStackTrace();
             }
         }
         log.debug("——获取组中可用的storage IP——" + storageIp);
         return storageIp;
     }
    

    #五、效果查看
    这里写图片描述
    直接就可以集成swagger通过api接口上传文件了,搭建好nginx环境后可以通过返回的url路径访问上传的文件,别的就不再一一演示了,自己去查看效果吧

    展开全文
  • js,java上传文件到服务器

    千次阅读 2017-06-09 15:32:49
    页面 src="$request.contextPath/resources/js/page/optimizationJob.js"> 上传您的文件 :

    页面

     

    <script language="JavaScript" type="text/javascript"
            src="$request.contextPath/resources/js/page/optimizationJob.js"></script>
    <script type="text/javascript" src="$request.contextPath/resources/js/common/jquery-form.js"></script>
    
    <div align="left" style="margin-left: 38%">
        <table>
            <tr>
                <td align="center">
                    <div class="text1">上传您的文件 :</div>
                </td>
                <td style="padding-left: 10px">
                    <form action='/optimizationJob/uploadFile.action'
                          enctype="multipart/form-data" method="post" id="fileForm" name="fileForm">
                        <input type="file" class="a-upload" name="file" id="file" style="width:103%"/>
                    </form>
                </td>
            </tr>
            <tr>
                <td>
                </td>
                <td style="padding-left: 3%;padding-top: 3%">
                    <button id="executeBtn" class="btn btn-primary " type="button"
                            style="background: #3692FD;border-radius: 6px; width: 29%;height: 10%"
                            onclick="subimtBtn()">
                        <div class="buttonText1">
                            上传运行
                        </div>
                    </button>
                    <h5  class="modal-title" id="uploadTip"></h5>
                </td>
            </tr>
        </table>
    </div>

    js

     

    //上传运行
    function subimtBtn() {
        $("#submitBtn").attr("disabled", true);
        var fileName = $('#file').val();
        console.log("fileName:" + fileName)
        if (fileName == null || fileName == undefined || fileName == '') {
            callModelErrorMessageBox("文件不能为空");
            $("#submitBtn").attr("disabled", false);
            return;
        }
    
        if (fileName.length <= 4) {
            callModelErrorMessageBox("文件名称不对");
            $("#submitBtn").attr("disabled", false);
            return;
        }
    
        fileName = fileName.substring(fileName.length - 4, fileName.length);
        console.log(fileName)
        if (fileName != '.xls') {
            callModelErrorMessageBox("文件格式需要是.xls");
            $("#submitBtn").attr("disabled", false);
            return;
        }
    
        var form = $("form[name=fileForm]");
        $("#uploadTip").html("正在上传...");
        var options = {
            action: '/optimizationJob/uploadFile.action',
            type: 'post',
            success: function (data) {
                var success = data.success;
                var errMsg = data.errMsg;
                if (success == "Y") {
                    console.log("上传成功,返回success=Y,errMsg:" + errMsg);
                    $("#uploadTip").html("上传成功");
                } else {
                    console.log("上传失败,返回success=N,errMsg:" + errMsg);
                    $("#uploadTip").html("上传失败");
                }
                $("#submitBtn").attr("disabled", false);
            },
            error: function (data) {
                console.log("上传失败,返回error");
                $("#uploadTip").html("上传失败");
                $("#submitBtn").attr("disabled", false);
            }
        };
        form.ajaxSubmit(options);
    }//subimtBtn


    java

     

     

     private File file;
    	
    	    @Action(value = "uploadFile")
        public void uploadFile() throws Exception {
            //先创建本地文件夹
            String filePath = "C:\\";
            LOG.info("filePath: " + filePath);
            //开始保存到本地
            String fileName = getLoginErp() + "_" + DateUtil.formatYyyyMMddHHmmss(new Date()) + ".xls";
            try {
                OutputStream os = new FileOutputStream(new File(filePath + fileName));
                InputStream is = new FileInputStream(file);
                LOG.info("fileName: " + fileName);
                byte[] buffer = new byte[10240];
                while (-1 != (is.read(buffer, 0, buffer.length))) {
                    os.write(buffer);
                }
                os.close();
                is.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
                resultMap.put("errMsg", "上传文件异常");
                resultMap.put("success", "N");
                Gson gson = new Gson();
                String result = gson.toJson(this.resultMap);
                log.info("上传文件的响应数据:" + result);
                response.setContentType("text/json;charset=UTF-8");
                response.getWriter().write(result);
            } catch (IOException e) {
                e.printStackTrace();
                resultMap.put("errMsg", "上传文件异常");
                resultMap.put("success", "N");
                Gson gson = new Gson();
                String result = gson.toJson(this.resultMap);
                log.info("上传文件的响应数据:" + result);
                response.setContentType("text/json;charset=UTF-8");
                response.getWriter().write(result);
            }
            resultMap.put("errMsg", "上传文件成功");
            resultMap.put("success", "Y");
            Gson gson = new Gson();
            String result = gson.toJson(this.resultMap);
            log.info("上传文件的响应数据:" + result);
            response.setContentType("text/json;charset=UTF-8");
            response.getWriter().write(result);
        }//uploadFile
    
        public File getFile() {
            return file;
        }
    
        public void setFile(File file) {
            this.file = file;
        }


     

     

     

    欢迎关注我的公众号

     

     

    展开全文
  • 今天项目中用一个上传下载文件的功能,发现本地文件上传到服务器速度比较慢,用正常的InputStream获取文件流,然后in.read()读取,out.write()写到服务器,这种会比较慢;(可以附上代码) 提升方法Java中NIO通道...

    今天项目中用到一个上传下载文件的功能,发现本地文件上传到服务器速度比较慢,用正常的InputStream获取文件流,然后in.read()读取,out.write()写到服务器,这种会比较慢;(可以附上代码)
    1.IO流(面向流、阻塞IO)

    String fileName = "D:\\test.zip";
    File file = new File(fileName);
    FileInputStream fis = new FileInputStream(file);
    fileName = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date())+"_" + fileName;//存到服务器的地址
    FileOutputStream out = new FileOutputStream("服务器路径" + fileName);
    int ch = -1;
    while((ch = fis.read())!= -1){
    	out.write(ch);//写文件
    }
    
    

    提升方法Java中NIO通道channel
    然后在博客上发现:借鉴一下
    2.NIO流(面向缓冲、非阻塞IO)

    FileInputStream fis = new FileInputStream(file) ;
    FileChannel inChannel = fis.getChannel();
    FileChannel outChannel = out.getChannel();
    //分配指定大小缓存区
    ByteBuffer buffer = ByteBuffer.allocate(1024);
    //将通道中的数据缓冲区中
    while (inChannel.read(buffer) != -1) {
     	buffer.flip();//切换成读数据模式
    	//将缓冲区中的数据写入通道中
    	outChannel.write(buffer);
    	buffer.clear();//清空缓冲区
    }
    
    finally{
    //不要忘了关闭通道和流
    if(inChannel!=null){
    	try{
    		inChannel.close();
    	}catch(Exception e){
    		e.printStackTrace();
    	}
    }
    //...
    outChannel.close();
    fis.close();
    out.close();
    
    }
    
    

    原文链接:https://blog.csdn.net/u013063153/article/details/76474189
    https://blog.csdn.net/nmj2015/article/details/79913259

    java面向流IO和面向缓冲区NIO区别:
    1.面向流:意味着每次从流中读取一个或多个字节,直至读取所有字节,都没有被缓存在任何地方。
    2.数据读取到一个稍后处理的缓冲区,需要时可在缓冲区前后移动,增加了处理过程的灵活性。

    展开全文
  • Java上传文件到服务器返回url

    千次阅读 2019-11-13 18:41:13
    文件上传地址: public static String getImgUploadPath ( String folderName ) { // /home/yishang_data/project/lib/yishang_data_main.jar!/BOOT-INF/classes!/../../upload String path = ...
    private String saveImageReturnPath(MultipartFile multiFile) throws IllegalStateException, IOException {
    		
    		String dateName = PicFileUtil.randomFileName()+multiFile.getOriginalFilename();
    		
            String path = PicFileUtil.getImgUploadPath(Constants.UPLOAD_NAME); // /upload
    
            String fileName = String.format("%s/%s", PicFileUtil.dateFolder(), dateName);
    
            String filePathName = String.format("/%s/%s", Constants.UPLOAD_NAME, fileName);
            
            String filePath = String.format("/%s/%s", path, fileName);
    
            File file = new File(filePath);
            if (!file.getParentFile().exists()) {
                file.getParentFile().mkdirs();
            }
            multiFile.transferTo(file);
            return filePathName;
        }
    	// 上传文件
    
    	@Override
    	public String uploadFile(MultipartFile file) {
    			
    		try {
    			return "/ba/"+saveImageReturnPath(file);
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		return null;
    		
    	}
    }
    

    文件上传地址:

    public static String getImgUploadPath(String folderName) {
    		
    		// /home/yishang_data/project/lib/yishang_data_main.jar!/BOOT-INF/classes!/../../upload
    		String path = ClassUtils.getDefaultClassLoader().getResource("").getPath() + "../../../../" + folderName;
    		path = path.replace("file:", "");
    		
    		log.info("path={}", path);
    		
    		File file = new File(path);
    		if( ! file.exists() ) {
    			file.mkdirs();
    		}
    		path = getRealPath(path);
    		return path;
    	}
    
    展开全文
  • 今天遇到了这么一个问题,就是上传上传成功了,但是查找却发现文件没有在该文件夹下,解决思路如下: 1、使用linux指令在更目录下查询是否有上传文件 find -name 文件名称 有------》查看路径是否正确,...
  • java上传文件到FTP服务器

    万次阅读 2019-03-17 00:58:52
    前段时间,项目中使用上传文件到FTP服务器,再此略作整理,形成一个util工具,方便日后使用。 项目代码已上传至github:https://github.com/hack-feng/ftpdemo.git 点击直接前往 首先定义一个FTP服务器上传...
  • JAVA上传文件图片到服务器保存

    万次阅读 热门讨论 2017-04-10 11:58:57
    这里我记录一个比较简单方便操作的JAVA上传文件图片到服务器并且保存! 首先是页面 html的 我这是提交一个文件和类型 <div style="border: 1px solid red;"> 我是添加一张临时图片得到微信的media_...
  • java文件上传到服务器

    万次阅读 2019-03-06 10:05:32
    java文件上传到服务器 最近项目中使用文件从本地到服务器的功能。其实是为了解决目前浏览器不支持获取本地文件全路径。不得已而想到上传到服务器的固定目录,从而方便项目获取文件,进而使程序支持EXCEL批量...
  • java上传文件到远程服务器七牛云

    千次阅读 2017-06-08 20:18:47
    如下: java上传文件到远程服务器(一)---HttpURLConnection方式java上传文件到远程服务器(二)---HttpClient方式如果说 不想自己搭建 静态资源Linux服务器的话,现在有很多免费的静态资源云服务可以使用。本文记录...
  • Java文件上传到服务器

    千次阅读 2019-08-05 09:49:30
    import java.io.File; import com.sun.jersey.api.client.Client; import ... /** * 文件上传帮助类 * @author yaco * @Date 2019年7月18日 下午2:16:09 */ public class UploadUtils...
  • Java 上传文件到ftp服务器

    万次阅读 多人点赞 2016-02-26 15:30:03
    前两篇文章我们搭建了一个ftp服务器,并对服务器进行了相应的配置,这篇文章我们来说一下我们如何上传文件。  先介绍一下项目,本项目采用的是spring mvc +spring +mybatis ,用maven 进行项目管理。看一下项目...
  • java 上传文件到Linux服务器 工具类

    万次阅读 2017-06-06 10:09:35
    最近在帮同学做一个音乐推荐系统后台,需要java远程调用Linux服务器,执行深度学习算法,处理由本地上传文件。查找了相关的资料,利用ftpClient上传文件到服务器。在此贴一下这个助手类(网上很多)。 import org....
  • java上传文件到远程服务器(一)---HttpURLConnection方式

    万次阅读 多人点赞 2017-06-08 15:30:05
    我们在之前的文章JavaWeb静态资源分离思路中已经了解要把文件上传静态资源服务器有三种方式:java上传文件到ftp服务器(这个方案需要在静态资源服务器安装ftp服务)java使用HttpURLConnection上传文件到远程服务器 ...
  • Java文件上传到服务器

    千次阅读 2015-09-14 17:45:55
    FormFile file=manform.getFile(); String fileName = null; String pathname=null; String fileAddre=”/uptoService”; try { InputStream stream = file.getInputStream();... String filePath =
  • 1、首先将文件上传到服务器, 2、将文件传到数据库 3、上传完成后,删除文件
  • Java上传文件到服务器

    万次阅读 2016-02-03 22:57:10
    Web文件上传采用POST的方式,与POST提交表单不同的是,上传文件需要设置FORM的enctype属性为multipart/form-data.由于上传文件会比较大,因此需要设置该参数指定浏览器使用二进制上传。如果不设置,enctype属性...
  • 我们已经在上一篇文章中讲解了把文件上传远程服务器的一种方式:java上传文件到远程服务器(一)---HttpURLConnection方式本章来尝试使用HttpClient方式上传文件到远程服务器:我们在之前的文章中已经在SpringMVC基础...
  • java 实现上传文件到远程服务器

    热门讨论 2014-11-19 12:23:29
    java实现上传文件到远程服务器(spring mvc)
  • 惟独用手机上传大于2M的图片时会上不了,后台代码也没有报错,只是返回"The document has moved here"这样一个字符串,错误码是302 初步确定是服务器的问题因为我将服务器端口由80改成8080就没问题了.。接下来就不...
  • 请看原文
  • 原来项目单机部署 ,用Java上传文件至单一服务器,后来项目多机部署,文件得放在一台服务器下,公司比较 kou,不肯买 oss服务,于是就换成了 ftp 方式上传文件 1.引入maven 依赖 <dependency> <groupId&...
  • 写给大忙人看的 - Java上传文件MinIO服务器(二)

    万次阅读 多人点赞 2020-05-10 18:25:48
    上一篇 写给大忙人看的 - 搭建文件服务器 MinIO(一),我们已经成功地搭建了 MinIO 文件服务器,这一篇讲解在 Java 中如何上传文件至 MinIO 一、开发前戏 1、项目中引入 maven 依赖 <!-- minio 相关依赖 --> ...
  • 本文文件上传使用是RestTemplate,之前也使用过HttpURLConnection上传过,不过这种方式比较繁琐,所有最后综合使用RestTemplate。 本文案例。 项目环境:springboot+maven+mybatis 客户端代码: import ...
  • 通过这次HttpURLConnection上传超大文件了解了更多内容:1.Java nio的MappedByteBuffer(内存映射),更快更高效读取大文件,读取超过2g的大文件import java.io.FileInputStream; import java.io.IOException; import ...
  • import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.net.SocketException;import java.sql.Connection;import java.sql.DriverManager;import...
  • JAVA本地上传文件到OSS服务器

    千次阅读 2019-11-26 18:07:57
    最近需要把文件上传到阿里云服务器,简单记录一下,看了很多文章都没有标出来使用的jar包,首先maven项目在pom文件里添加 <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>...
  • java通过ftp 上传文件到服务器

    千次阅读 2018-11-04 17:25:36
    import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 293,609
精华内容 117,443
关键字:

java上传文件到服务器

java 订阅