精华内容
下载资源
问答
  • 上传文件慢,大文件上传卡顿,请求超时怎么办? 话不多说直接上代码,代码复制过去可以直接使用 第一步:创建后端代码 package cn.leon.demo.rest; import lombok.extern.slf4j.Slf4j; import org.apache....

    Java上传文件慢,大文件上传卡顿,请求超时怎么办?

    话不多说直接上代码,代码复制过去可以直接使用

    第一步:创建后端代码

    package cn.leon.demo.rest;
    
    import lombok.extern.slf4j.Slf4j;
    import org.apache.commons.io.FileUtils;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.web.bind.annotation.*;
    import org.springframework.web.multipart.MultipartFile;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.UUID;
    
    /**
     * 分片上传文件相关接口
     *
     * @author leon
     * @date 2021/03/19 17:40:06
     */
    @Slf4j
    @RequestMapping("/chunk-upload")
    @RestController
    public class UploadFileController {
    
    
        /**
         * 文件上传路径,配置文件配置或者这里写死也行
         * ##fileUploadPath
         * file.upload.path=/Users/leon/Desktop
         **/
        @Value("${file.upload.path}")
        private String fileUploadPath;
    
    
        /**
         * 分片上传小文件
         *
         * @param clientId 客户端ID,每个客户端每次上传时生成,保持唯一
         * @param chunkId  分片ID,从0开始累加,每次上保持传唯一
         * @param chunks   分片总数
         * @param file
         * @return java.lang.String
         * @author leon
         * @date 2021/04/07 17:16:59
         */
        @CrossOrigin
        @PostMapping("/part")
        public Result bigFile(
                MultipartFile file, 
                @RequestParam(name = "clientId", required = true) String clientId, 
                @RequestParam(name = "chunks", required = true) Integer chunks, 
                @RequestParam(name = "chunkId", required = true) Integer chunkId) throws Exception {
            log.info("开始上传分片文件,客户端ID:{},总分片数:{},分片ID:{}", clientId, chunks, chunkId);
            // 文件存放目录:临时目录用来存放所有分片文件
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd/");
            String dateStr = sdf.format(new Date());
            //临时文件目录
            String tempFileDir = fileUploadPath + File.separator + dateStr + clientId;
            File parentFileDir = new File(tempFileDir);
            if (!parentFileDir.exists()) {
                parentFileDir.mkdirs();
            }
            // 分片处理时,前台会多次调用上传接口,每次都会上传文件的一部分到后台
            File tempPartFile = new File(parentFileDir, clientId + "_" + chunkId + ".part");
            FileUtils.copyInputStreamToFile(file.getInputStream(), tempPartFile);
            log.info("分片文件上传成功,分片ID:{}", chunkId);
            return "ok";
        }
    
        /**
         * 上传分片文件完成后合并成一个大文件
         *
         * @param clientId 客户端ID,每次上传时生成和分片上传时参数保持一致
         * @param fileName 原文件名
         * @return java.lang.String 返回最终保存文件路径
         * @author leon
         * @date 2021/04/07 17:13:46
         */
        @CrossOrigin
        @PostMapping("/merge")
        public String mergeFile(
                @RequestParam(name = "clientId", required = true) String clientId, 
                @RequestParam(name = "fileName", required = true) String fileName) throws Exception {
            log.info("开始合并文件,客户端ID:{},文件名:{}", clientId, fileName);
            // 文件存放目录
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd/");
            String dateStr = sdf.format(new Date());
            //最终文件上传目录
            String fileSavePath = fileUploadPath + File.separator + dateStr;
            //临时文件目录
            String tmpFileSavePath = fileSavePath + clientId;
            //最终文件上传文件名
            String newFileName = UUID.randomUUID().toString();
            if (fileName.indexOf(".") != -1) {
                newFileName += fileName.substring(fileName.lastIndexOf("."));
            }
            //创建父文件夹
            File parentFileDir = new File(tmpFileSavePath);
            if (parentFileDir.isDirectory()) {
                File destNewFile = new File(fileSavePath, newFileName);
                if (!destNewFile.exists()) {
                    //先得到文件的上级目录,并创建上级目录,再创建文件
                    destNewFile.getParentFile().mkdir();
                    destNewFile.createNewFile();
                }
                //遍历"所有分片文件"到"最终文件"中,此处一定要按照顺序合并文件,不然会导致文件合并错乱不可用
                for (int i=0;i<parentFileDir.listFiles().length;i++) {
                    FileOutputStream destNewFileFos = new FileOutputStream(destNewFile, true);
                    FileUtils.copyFile(new File(parentFileDir, clientId + "_" + i + ".part"), destNewFileFos);
                    destNewFileFos.close();
                }
                // 删除临时目录中的分片文件
                FileUtils.deleteDirectory(parentFileDir);
            }
            log.info("合并文件完成,客户端ID:{},文件名:{}", clientId, fileName);
            return fileSavePath + newFileName;
        }
    
    }
    
    

    第二步:创建前端代码测试

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>分片上传文件测试</title>
        <script src="http://cdn.bootcss.com/jquery/1.12.4/jquery.min.js"></script>
        <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
    </head>
    <body>
    <div id="uploader">
        <div class="btns">
            <input id="file" name="file" type="file"/>
            <br>
            <br>
            <button id="startBtn">
                开始上传
            </button>
            </br>
            </br>
        </div>
        <div id="output">
        </div>
    </div>
    </body>
    <script type="text/javascript">
        var status = 0;//上传状态
        var startDate;
        var page = {
            init: function(){
                $("#startBtn").click($.proxy(this.upload, this));
            },
            upload: function(){
                startDate = (new Date()).getTime();
                console.log("开始上传文件......");
                status = 0;
                var clientId = this.generateClientId();
                var file = $("#file")[0].files[0],  //文件对象
                    fileName = file.name,        //文件名
                    size = file.size;        //总大小
                var shardSize = 1024 * 1024,    //以1MB为一个分片
                // var shardSize = 500 * 1024,    //以500kb为一个分片
                shardCount = Math.ceil(size / shardSize);  //总片数
                console.log("每个分片文件1MB,总分片数:"+shardCount);
                // console.log("每个分片文件500kb,总分片数:"+shardCount);
                for(var i = 0;i < shardCount;++i){
                    //计算每一片的起始与结束位置
                    var start = i * shardSize,
                        end = Math.min(size, start + shardSize);
                    var partFile = file.slice(start,end);
                    this.partUpload(clientId,partFile,fileName,shardCount,i);
                    console.log("第"+i+"个分片文件上传成功");
                }
                var endDate = (new Date()).getTime();
                console.log("所有分片文件上传请求发送成功,总耗时:"+(endDate-startDate)+"毫秒");
            },
            partUpload:function(clientId,partFile,fileName,chunks,chunkId){
                //构造一个表单,FormData是HTML5新增的
                var  now = this;
                var form = new FormData();
                form.append("clientId", clientId);
                form.append("file", partFile);  //slice方法用于切出文件的一部分
                form.append("fileName", fileName);
                form.append("chunks", chunks);  //总片数
                form.append("chunkId", chunkId);        //当前是第几片
                //Ajax提交
                $.ajax({
                    url: "http://localhost:8080/chunk-upload/part",
                    type: "POST",
                    data: form,
                    async: true,        //异步
                    processData: false,  //很重要,告诉jquery不要对form进行处理
                    contentType: false,  //很重要,指定为false才能形成正确的Content-Type
                    success: function(data){
                        status++;
                        if(data.code == 0){
                            $("#output").html(status+ " / " + chunks);
                        }else{
                            alert('出现异常:'+data.message);
                        }
                        if(status==chunks){
                            var endDate = (new Date()).getTime();
                            console.log("所有分片文件上传成功,总耗时:"+(endDate-startDate)+"毫秒")
                            now.mergeFile(clientId,fileName);
                        }
                    }
                });
            },
            mergeFile:function(clientId,fileName){
                var formMerge = new FormData();
                formMerge.append("clientId", clientId);
                formMerge.append("fileName", fileName);
                $.ajax({
                    url: "http://localhost:8080/chunk-upload/merge",
                    type: "POST",
                    data: formMerge,
                    processData: false,  //很重要,告诉jquery不要对form进行处理
                    contentType: false,  //很重要,指定为false才能形成正确的Content-Types
                    success: function(data){
                        if(data.code == 0){
                            var endDate = (new Date()).getTime();
                            console.log("上传文件成功,总耗时:"+(endDate-startDate)+"毫秒");
                            alert('上传成功!');
                        }else{
                            alert('出现异常:'+data.message);
                        }
                    }
                });
            },
            generateClientId:function(){
                var counter = 0;
                var clientId = (+new Date()).toString( 32 ),
                    i = 0;
                for ( ; i < 5; i++ ) {
                    clientId += Math.floor( Math.random() * 65535 ).toString( 32 );
                }
                return clientId + (counter++).toString( 32 );
            }
        };
    
        $(function(){
            page.init();
        });
    </script>
    </html>

     

    展开全文
  • 客户反应文件上传速度,需要对文件服务器的上传速度进行优化。拿到这个任务后首先是使用现有代码对文件服务器进行了上传下载速度的测试。测试的文件服务器是seaweedfs和fastdfs,抛开网络的问题测试结果如下: 1...

    1、出现问题

    客户反应文件上传速度慢,需要对文件服务器的上传速度进行优化。拿到这个任务后首先是使用现有代码对文件服务器进行了上传下载速度的测试。测试的文件服务器是seaweedfs和fastdfs,抛开网络的问题测试结果如下:

    1)上传2M文件

    seaweedfs:14s

    fastdfs:90ms

    2)下载2M文件

    seaweedfs:90M/s

    fastdfs:30M/s

    为什么???按照道理上传不应该会这么慢,按照道理seaweedfs的性能应该不会低于其他服务器那么多,肯定是哪里有问题。

     

    2、问题排查

    我们seaweedfs的组网是一个master 两个 volume ,上传方式是通过master的9333端口。seaweedfs文件服务器的原理是通过master选择节点上传到对应节点上。但是为什么这么慢,我们首先进行了TCP抓包,分别抓取了三个节点的端口数据流,结果如下(这里一个是早上抓的,一个是下午抓的,中午吃了饭睡了觉):

    1)master

    分析:上传时间和结束时间很明显,master确实处理了这么长时间。但大部分时间是在消耗在assign之前。

    2)volume1

    分析:文件真正上传存储完成的时间很短,问题不出在volume,但问题在哪儿呢,摸着石头过河只能下载源码来分析了。

    3)源码分析,经过一番折腾我们找到了如下源码:

    func submitForClientHandler(w http.ResponseWriter, r *http.Request, masterUrl string, grpcDialOption grpc.DialOption) {
    	m := make(map[string]interface{})
    	if r.Method != "POST" {
    		writeJsonError(w, r, http.StatusMethodNotAllowed, errors.New("Only submit via POST!"))
    		return
    	}
    
    	debug("parsing upload file...")
    	fname, data, mimeType, pairMap, isGzipped, originalDataSize, lastModified, _, _, pe := needle.ParseUpload(r)
    	if pe != nil {
    		writeJsonError(w, r, http.StatusBadRequest, pe)
    		return
    	}
    
    	debug("assigning file id for", fname)
    	r.ParseForm()
    	count := uint64(1)
    	if r.FormValue("count") != "" {
    		count, pe = strconv.ParseUint(r.FormValue("count"), 10, 32)
    		if pe != nil {
    			writeJsonError(w, r, http.StatusBadRequest, pe)
    			return
    		}
    	}
    	ar := &operation.VolumeAssignRequest{
    		Count:       count,
    		Replication: r.FormValue("replication"),
    		Collection:  r.FormValue("collection"),
    		Ttl:         r.FormValue("ttl"),
    	}
    	assignResult, ae := operation.Assign(masterUrl, grpcDialOption, ar)
    	if ae != nil {
    		writeJsonError(w, r, http.StatusInternalServerError, ae)
    		return
    	}
    
    	url := "http://" + assignResult.Url + "/" + assignResult.Fid
    	if lastModified != 0 {
    		url = url + "?ts=" + strconv.FormatUint(lastModified, 10)
    	}

     

    注意到了 url := "http://" + assignResult.Url + "/" + assignResult.Fid 这行代码,就是我们抓包时看到的耗时后调用的接口。这个方法是submit的业务逻辑入口,那问题就在这个方法开始到上边提到的这一行。我们看看其中有什么可能导致速度慢的,翻阅了前边的代码,没有什么耗时的网络请求,可疑点就落在了参数解析上,文件越大耗时越长,是不是参数解析工具将文件当作参数来解析了呢?

     

    4)我们又进行了指令上传测试

    通过curl走9333端口对文件进行上传。结果令人诧异,2M文件的上传速度尽然变成了100多ms。问题基本能够确定在java提交数据到文件服务的时候,文件服务将文件当作参数解析了一遍。(时间问题具体的原因就没有深究,不过让人怀疑r.ParseForm()这个方法)

     

    5)看java代码

    使用的是各大搜索引擎搜索出来的一个java调用seaweedfs上传文件的一个示例:

    
    httpClient1 = HttpClients.createDefault();
    HttpPost httpPost = new HttpPost("http://IP:9333/submit");
    httpPost.setHeader(new BasicHeader("Accept-Language", "zh-cn"));
    File file = new File("/xxxx.txt");
    FileBody bin = new FileBody(file);
    HttpEntity reqEntity = MultipartEntityBuilder.create().setCharset(Charset.forName("UTF-8")).setMode(HttpMultipartMode.BROWSER_COMPATIBLE).addBinaryBody(URLEncoder.encode("xxxx.txt"), file).build();
    httpPost.setEntity(reqEntity);
    System.out.println(httpPost.toString());
    response1 = httpClient1.execute(httpPost);

    这段代码有问题么?没有问题,但是结合了go语言的http参数解析放到一起就出问题了。

     

    3、问题解决

    更换问文件上传方式,先调用master的assign接口,获取文件id及volume节点,然后直接上传文件到volume节点,代替submit接口做这两件事。

    修改代码后,测试ok,2M文件上传时间测试180ms左右。

    (也可以直接使用seaweedfs-java-client来做这件事情,可以减少很多编码工作)

     

    4、总结

    很多时候从软件自身来看确实不存在任何问题,但可能两个或多个软件组合成系统以后就会出现很多奇奇怪怪的问题,需要去调试、检测,最终才能成为一个稳定的系统。

    展开全文
  • ftp上传文件慢卡问题的解决

    万次阅读 2017-02-16 12:28:00
    以前传文件没问题。...传文件也要反复多次才能上传成功。 开始以为是防火墙的问题。关了一样。时好时坏。有人说是网络问题。但同样在阿里云上另一台服务器没这个问题。从软件信息来看,有报错:[11:54:59] [R]

    linux系统下,安装有VSFTP服务器,多人共用一个ftp账号。以前传文件没问题。最近遇到登陆不顺(不是不能登陆),列表显示和传文件都慢,卡的问题。

    具体表现为:登陆不报错,但打开空白。列表也空白,要半天才出来。传文件也要反复多次才能上传成功。 开始以为是防火墙的问题。关了一样。时好时坏。有人说是网络问题。但同样在阿里云上另一台服务器没这个问题。

    从软件信息来看,有报错:

    [11:54:59] [R] 227 Entering Passive Mode (xxxxxxxx).
    [11:54:59] [R] 正在打开数据连接 IP: 121.0.0.0 端口: 40519
    [11:54:59] [R] LIST -al
    [11:54:59] [R] 425 Security: Bad IP connecting.
    [11:55:00] [R] 列表 错误
    [11:55:00] [R] 以 PASV 模式连接失败,正在尝试 PORT 模式。
    [11:55:00] [R] 正在侦听端口: 14912,正在等待连接。
    [11:55:00] [R] PORT 10,xx,xx,xx,58,64
    [11:55:00] [R] 500 Illegal PORT command.
    [11:55:01] [R] 列表 错误

    就是反复在主动和被动模式之间转换。因为有Bad IP字样。阿里技术员说可能是安全组设置而拦截了。但三台服务器,都在一个安全组,另两台服务器的FTP服务正常(用的是另一种FTP)。
    经查,vsftp的被动模式默认打开安全检查,该检查确保数据连接和控制连接是来自同一个IP地址。解决办法是关闭被动模式的安全检查。
    办法:在/etc/vsftpd/vsftpd.conf文件中添加如下一行:
    pasv_promiscuous=YES
    然后重新启动vsftp服务:service vsftpd restart

    至此问题解决。

    为什么以前可以现在出问题呢?原来,本单位是一个集团单位,IP地址有电信联通多路,多个IP且经常自动切换。每天登陆的IP都在变。而且最近还发现启用了以前没有的新IP。这个问题很可能是在连接中变换了IP地址造成的。这一点与本单位情况相符。

    有人说启用主动模式连接不就解决了。我启用主动模式后仍报错,仍会转换为被动,如果VSTFP中设定为主动模式,无法转换,则报错。
    据我的理解,主动模式服务器只用一个固定端口(20)来新建一个连接客户线路传数据。但由于多人共享一个账号,如果同时登陆,就会造成服务器端口冲突。被动模式,是服务器打开一个新端口,由客户端来新建连接传递数据。这样就可以同时多路工作而不冲突。

    展开全文
  • java ftp上传文件慢的解决方案

    千次阅读 2015-05-07 14:17:00
     这是优化之前的代码 ,上传几百kb的文件都需要20秒,感觉特别,最后在网上查了相关的资料,尝试着对代码进行了优化,  主要是增加了  ftp.setBufferSize(1024*1024); 增大缓存区  其次是因为是网络流 ...
     FTPClient ftp = new FTPClient(); 
     ftp.connect("172.16.2.5", 21);  
     ftp.login("aaa", "aaaa");        
     ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
     ftp.changeWorkingDirectory("C:\\FtpPublic");
     InputStream input = new ByteArrayInputStream(bytes);  
     ftp.storeFile(filename,input);

      这是优化之前的代码 ,上传几百kb的文件都需要20秒,感觉特别慢,最后在网上查了相关的资料,尝试着对代码进行了优化,

     主要是增加了  ftp.setBufferSize(1024*1024); 增大缓存区

      其次是因为是网络流  将输入流 加上BufferedInputStream         BufferedInputStream input = new BufferedInputStream( new ByteArrayInputStream(bytes));


     FTPClient ftp = new FTPClient(); 
     ftp.connect("172.16.2.5", 21);  
     ftp.login("aaa", "aaaa");        
     ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
     ftp.setBufferSize(1024*1024);
     ftp.changeWorkingDirectory("C:\\FtpPublic");
     BufferedInputStream input = new BufferedInputStream(new ByteArrayInputStream(bytes)); 
     ftp.storeFile(filename,input);

    修改后感觉上传速度飞快,这是本人亲自实践的!!!


    转载于:https://my.oschina.net/lichao100/blog/411783

    展开全文
  • java上传文件慢处理方案

    千次阅读 2019-06-05 17:28:55
    我们平时经常做的是上传文件上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用。 首先我们需要了解的是上传文件三要素: 1.表单提交方式:post(get方式提交有大小限制,post...
  • Nginx上传文件

    千次阅读 2020-04-22 23:45:06
    收到同事反馈,一个上传apk的接口,传一个180多兆的文件,一直转圈,最终提示上传文件失败 Bug所处背景 带宽为10M的云服务器,额,,,就算按照7M的带宽,如果是一个180M的文件,网络顺畅的话,大概需要xxx 项目...
  • 1.出现上传文件速度很,而且文件大小始终为0.使用FileZilla正常上传文件无损坏 添加代码:调用FTPClient的enterLocalPassiveMode();方法,设置为被动模式,既可以解决。 不使用代码的临时开启的话,可以直接...
  • 上传文件的原因

    千次阅读 2012-01-07 19:10:42
    上传文件的原因分析 tracert ip /d  指定不将地址解析为计算机名。  -h maximum_hops  指定搜索目标的最大跃点数。  -j computer-list  指定沿 computer-list 的稀疏源路由。  -w timeout  ...
  • 最近有位朋友的百度网盘下载速度很快,但是上传速度很的时候,不知道为什么会这样。那么,这种情况应该如何解决呢?下面就来看一下百度云上传速度的时候,如何加快百度云上传速度!为什么百度云满速下载,上传速度...
  • 主要介绍了Java实现ftp文件上传下载解决中文乱码多个文件下载等问题的相关资料,非常不错具有参考借鉴价值,需要的朋友可以参考下
  • FTP上传文件速度太怎么办?

    千次阅读 2018-04-25 16:40:04
    但是也有不少用户反映使用FTP上传文件速度太,这是什么原因呢?FTP上传文件速度太怎么办?一、为什么FTP上传文件速度太? 运维人员在日常的工作中会使用FTP软件上传补丁、升级包、下载数据、日志等数据。FTP...
  • 上传文件响应的处理方法

    千次阅读 2017-11-13 10:43:00
    input[file]标签的 accept 属性可用于指定上传文件的 MIME 类型。例如,想要实现默认上传图片文件的代码,代码可如下: <input type="file" name="file" class="element" accept="image/*"> 效果如下图...
  • 网络问题较大,自己用软件测试(winscp)同样很刚开始文件很少,读取目录速度没有那么,时间长了,文件变多 第一版代码 class SftpInfo(object): def __init__(self, username, password, timeout=3000): self...
  • FTP是一款软件来着,简单地说就是文件传输协议的意思,我们从事SEO行业,都会用到FTP软件。比方说,我们在建设网站时,会需要使用FTP软件将网站程序上传到虚拟主机或者是我们的服务器。还有,我们想要修改网站里面的...
  • 假如一个场景,用户上传文件,某些用户网速较,同时存在100个这样的用户,如果BIO且最大线程设为100会导致线程用完。NIO怎么来解决这个问题? 本实例采用tomcat8作为容器,开启异步servlet读写事件,解决高并发IO...
  • 美国服务器上传文件速度怎么解决? 一、更换网络 网络的好坏对文件传输速度的影响很大,通常来说,运营商是其中最大的因素,比如,如果你此时使用的是联通的宽带,不妨更换为电信试试。如果已经使用电信,不妨加大...
  • 解决FTP上传文件速度的问题

    万次阅读 2018-06-15 13:57:48
    我们在利用ftp的storeFile()上传存储文件的时候,为了让上传速度提升,建议采用添加缓冲区的方式,根据上传文件的大 小,设置缓冲区大小,上传的过程中,缓冲区写满后才会进行磁盘的读写操作。ftp.setBufferSize...
  • VMware 中 Linux 使用 Xftp 上传文件速度
  • 目录 问题表现 解决办法 问题表现 rz上传一个50M的文件上传速度,卡着不动 ...
  • 问题描述: 最近在项目中遇到一个问题,每次ftp上传图片的的速度都超级,...ftp上传文件速度主要有两方面的原因: 1.网络问题,网速限制,并且没使用缓冲流来操作,导致上传的速度比较! 2.登录ftp与ftp...
  • 之前使用axios自带post上传数据能上传但是有一部分安卓手机上传非常非常非常非常的,包括华为手机、小米8等等(其他手机没具体测试过)。本来3秒内能搞定的那些手机却要15-30秒~~~。 客户看到这个上传也很不...
  • 这是页面的代码,js中配置zip类型打开窗口,低版本的谷歌和火狐没有这种问题,谁遇到过? ``` <p>Your browser doesn't have Flash, Silverlight or HTML5 support.</p> ```
  • WebUploader UEditor chrome 点击上传文件选择框会延迟几秒才会显示 反应很 chrome52.0.2743.80以上, accept: { title: 'Images', extensions: 'jpg,jpeg,png', mimeTypes: 'image/*' } 改为 accept...
  • 微软官方说明 http://support.microsoft.com/kb/329781/en-us#top
  • VMWare ESXi上传iso镜像文件问题

    千次阅读 2019-11-28 17:25:25
    VMWare ESXi虚拟机上传iso镜像文件问题 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本...
  • 在网速的情况下解决文件上传慢造成用户体验差的问题,我这里实践的方案有三种: 前端使用ajax 的方式异步把文件上传到服务端,然后服务端再对文件读写进行异步IO. 比如可以使用queue or asyc job or schedual,...
  • github是程序员必备的代码托管平台,上面有许多公开项目资源可以供学习者免费下载学习,但有时候在github用git clone 下载公开项目的文件时,速度奇啊,几kb每秒啊,逗我呢大哥?项目文件稍微大点的,不是要等到...
  • 当我尝试了多种代码优化后发现上传速度还是一样,这时我发现每次文件上传网络流量很奇怪。如下图: 这时排查一下nginx的跨域配置,发现后端的配置是服务器的ip,将ip修改成localhost,修改的前提是前后端的项目...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 102,846
精华内容 41,138
关键字:

上传文件慢