精华内容
下载资源
问答
  • 上传文件接口

    2020-10-29 23:26:09
    一个用于上传文件接口 这个接口可以设置统一的返回格式, 使用到的npm插件有multer 和 express const express = require("express"); const router = express.Router(); const multer = require("multer"); var ...

    一个用于上传文件的接口

    这个接口可以设置统一的返回格式, 使用到的npm插件有multer 和 express
    const express = require("express");
    const router = express.Router();
    const multer = require("multer");
    
    var storage = multer.diskStorage({
    	//设置上传后文件路径,uploads文件夹会自动创建。
    	destination: function(req, file, cb) {
    		cb(null, './uploads')
    	},
    	//给上传文件重命名,获取添加后缀名
    	filename: function(req, file, cb) {
    		var fileFormat = (file.originalname).split(".");
    		//给图片加上时间戳格式防止重名名
    		//比如把 abc.jpg图片切割为数组[abc,jpg],然后用数组长度-1来获取后缀名
    		cb(null, file.fieldname + '-' + Date.now() + "." + fileFormat[fileFormat.length - 1]);
    	}
    });
    var upload = multer({
        storage: storage,
        
        fileFilter: function(req, file, cb){
            let mimetype = file.mimetype;
            let types = ["jpg","jpeg","png","gif"];
            let tmpType = mimetype.split('/')[1];
            // 限制文件上传类型,仅可上传png格式图片
            if(types.indexOf(tmpType) == -1){
                req.fileCheckError = {
                    err : -1,
                    msg : "数据类型错误"
                }
                cb(null, false)
            } else {
                cb(null, true)
            }
        },
        limits:{
            //限制文件大小500kb
            fileSize: 500000,
        }   
    }).single('img');
    
    
    router.post("/upload", function (req,res) {
        upload(req, res, function (err) {
            if (err instanceof multer.MulterError) {
                if (err.message == 'File too large') {
                    res.send({
                        err : -2,
                        msg : "图片尺寸大小应该小于500KB"
                    })
                } else {
                    console.log(err, 'multer error') //处理multer自身的错误
                    res.send(err)
                }
            } else if (err) {
                console.log('normal error', err) // 处理委托给express和上传时express自身的错误
                res.send(err.Error)
            } else if (req.fileCheckError) {
                res.send(req.fileCheckError)
            } else {
                res.send({
                    err : 0,
                    msg : "上传成功"
                })
            }
          })
    })
    
    module.exports= router;
    
    展开全文
  • 请问传输稍大点的文件到接口时,接口定义的什么类型的参数比较好,string ,字节数组还是流...,因为是第一次做文件上传,没有经验,不知道定义接口传参格式是哪种比较好,文件大约几十到几百兆的音频文件
  • 文件上传接口设计

    千次阅读 2019-09-01 19:14:58
    1.问题描述 18年初跳槽来到新公司,在开发中惊奇的发现公司项目...这几个特性完全可以配置化定义规则(上家公司就是这么做的,配置化实现公用文件上传接口是一个正确的选择)。究其原因可能大家害怕更改之前的接口会...

    1.问题描述

    18年初跳槽来到新公司,在开发中惊奇的发现公司项目中的文件上传功能竟然存在多个接口,他们为每个需要文件上传的业务实现了接口,仔细看了下这些上传文件代码,他们主要区别在于每个业务存储的文件类型、文件大小、是否要压缩需要限制或者是文件路径需要指定不同。这几个特性完全可以配置化定义规则(上家公司就是这么做的,配置化实现公用文件上传接口是一个正确的选择)。究其原因可能大家害怕更改之前的接口会照成bug,索性自己重写一个上传接口(反正是复制粘贴过来改下内容吧)。
    下面我们进入主题,如何实现一个根据配置化定义规则的文件上传设计

    2.接口定义

    后端服务我们直接使用springboot2.X框架,文件上传相关配置信息将入数据库,这样可支持动态修改。测试用例我提供一个html页面,或者你可以直接使用postman。更详细的内容处理请看代码(实现很简单的)
    API信息:
    接口地址:http://127.0.0.1:8080/uploadFile
    请求格式:post | multipart/form-data;

    参数名必填/类型说明
    bizType是/String不同业务对应不同的类型,根据此类型查找文件上传的配置
    bizId否/Long业务id,可以通过该id找到对于的业务信息
    isShrink否(默认false)/boolean是否需要压缩代码为了简介,暂未实现支持是否压缩
    file文件信息,支持多文件上传

    返回列表 JSON: [FileInfo]

    3.数据库设计

    文件信息配置表 file_conf , 不同业务对应不同的配置,这里主要考虑了文件类型、文件大小、文件存储路径等。(甚至可以扩展出存储目标服务器、文件有效期等规则)

    字段类型约束说明
    idint(11)必填自增主键id
    bize_typevarchar(20)必填业务类型,不同业务不同的类型
    file_type_limitvarchar(200)非必填允许上传的文件类型(mine-type标准),为空时不限制类型
    file_size_limitvarchar(20)非必填允许上传的文件大小(kb),为空时不限制大小
    pathvarchar(50)必填服务器存储文件的路径
    descriptionvarchar(100)非必填描述,如描述该业务类型对应的文件上传业务功能的业务表
    resource_realmvarchar (100)必填外部访问文件资源相对根路径
    enabledtinyint(4)必填是否可用(默认1可用,0禁用),用于禁止某个业务上传文件的功能
    creat_timedatetime必填创建时间
    last_update_timedatetime非必填最近修改时间

    文件信表 file_info ,主要作用保存文件存储的相关信息,方便某些业务需要统计上传文件或删除文件时需要

    字段类型约束说明
    idint(11)必填自增主键id
    bize_typevarchar(20)必填业务类型
    bize_idint(11)非必填业务id
    original_namevarchar (255)必填文件原名称
    new_namevarchar(50)必填(唯一)文件新名称(随机码
    file_typevarchar(20)必填文件类型
    file_sizevarchar(20)必填文件大小(kb)
    file_pathvarchar(200)必填文件服务器存储绝对路径
    relative_pathvarchar(200)必填文件相对路径,域名+此字段为该资源的请求地址
    creat_timedatetime必填创建时间
    last_update_timedatetime非必填最近修改时间
    del_flagtinyint(1)必填逻辑删除(默认0正常,1文件已被物理删除)

    4.主要代码实现

    4.1.实体类信息

    对应数据库表结构建立对应实体类`

    /**
     * 文件配置信息</p>
     * table: file_conf
     * @author lilee
     * @version 1.0.0
     * @date 2018/12/20 14:55
     */
    public class FileConf {
        private Long id;  // 主键ID
        private String bizType;  // 上传服务类型
        private String fileTypeLimit; // 文件类型(mine-type标准),为空不限制上传类型
        private String fileSizeLimit; //(kb)文件限制大小,为空不限制上传大小(但要满足框架支持的上传文件大小)
        private String path; // 服务器文件夹路径
        private String description;  // 描述
        private String resourceRealm; // 访问资源路径
        private Boolean enabled; // 是否可用(默认1可用,0禁用)
        private Date createTime;  // 创建时间
        private Date lastUpdateTime;  // 最后修改时间
       
        // setter & getter
    }
    
    /**
     * 文件信息</p>
     * table: file_info
     * @author lilee
     * @version 1.0.0
     * @date 2018/12/20 14:55
     */
    public class FileInfo {
        private Long id;  // 主键ID
        private String originalName;  // 文件原名称
        private String newName; // 文件新名称
        private String fileType;  // 文件类型(image/jpg, image/png, video/mp4, xsl,doc等)
        private String fileSize; // 文件大小(kb)
        private String filePath;  // 文件服务器存储路径
        private String relativePath;  // 文件相对路径
        private Long bizId;  // 业务ID
        private String bizType;  // 上传服务类型(业务类型)
        private Date createTime;  // 创建时间
        private Date lastUpdateTime;  // 最后修改时间
        private Boolean delFlag; // 数据删除标记0=正常,1=文件已物理删除
        
        // setter & getter
    

    4.2.数据访问dao

    dao层,本实例为了简单,并未提供数据库操作相关代码,该模块需要用户根据自己项目架构自己实现。
    当前文件存储到/home/data下

    @Repository
    public class FileConfDao {
        // 根据业务类型bizType获取该业务的配置信息
        public FileConf selectByBizType(String bizType) {
            // todo 为了简单,未正真的对数据库操作 
            // FileConf fileConf = dbdao.findByBizType(bizType);
            FileConf fileConf = new FileConf();
            fileConf.setBizType(bizType);
            fileConf.setPath("/home/data");
            fileConf.setResourceRealm("/res");
            fileConf.setEnabled(true);
            return fileConf;
        }
        // 存储文件的信息
         public FileInfo insert(FileInfo fileInfo) {
           //  dbdao.insert(fileInfo)
            return fileInfo;
        }
    }
    

    4.3.文件上传核心service

    该模块实现文件上传的核心,主要包括对文件参数信息验证,对文件上传是否符合业务的配置验证、对配置规则的验证

    /**
     * TODO 文件上传service
     *
     * @author lilee
     * @version 1.0.0
     * @date 2018/12/20 14:55
     */
    @Service
    public class FileUploadService {
        @Resource
        private FileConfDao fileConfDao;
        // @Resource
        // private FileInfoDao fileInfoDao;
        protected static Logger log = LoggerFactory.getLogger(FileUploadService.class);
        /**
         * 文件上传
         * @param mpfList  文件信息集
         * @param bizType 业务类型(必传)
         * @param bizId   业务id
         * @param extraPath  额外的路径,首部和结尾不能带斜杠'/'
         * @return
         */
        public List<FileInfo> uploadFile(List<MultipartFile> mpfList, String bizType, Long bizId, String extraPath) {
            // 验证数据begin
            // 获取对应业务文件配置信息
            FileConf fileConf = this.fileConfDao.selectByBizType(bizType);
            if(fileConf == null){
                log.info("file conf is null");  // 打印文件配置信息
                return null;
            }
            // 验证文件信息是否符合配置信息
            if (!validateFileInfo(mpfList, fileConf)) {
                // 验证失败
                log.info("fileInfo is error");  // 打印文件配置信息
                return null;
            }
            // 信息验证end
            List<FileInfo> files = new ArrayList<>();
            FileInfo fileInfo = null;
            String path = fileConf.getPath();  // 文件存储的目录
            // 获取相对路径,由file_conf、额外路径
            String relativePath = fileConf.getResourceRealm() + "/"
                    + (StringUtils.isEmpty(extraPath) ? "" : extraPath + "/");
            // 验证服务器存储路径是否存在,若不存在,则新建文件夹
            File serFile = new File(path + relativePath);
            if (!serFile.exists()) {
                serFile.mkdirs();
            }
            // 循环上传文件
            for (MultipartFile mpf : mpfList) {
                String originalFileName = mpf.getOriginalFilename(); // 获取源文件名
                // 生成新文件名
                String newFileName = "F" + UUID.randomUUID().toString().replace("-", "").toUpperCase()
                        + originalFileName.substring(originalFileName.lastIndexOf("."));
                // 组装数据
                fileInfo = new FileInfo();
                fileInfo.setOriginalName(originalFileName);
                fileInfo.setFileSize(String.valueOf(mpf.getSize() / 1024)); // 单位(kb)
                fileInfo.setFileType(mpf.getContentType());     // 文件类型
                fileInfo.setNewName(newFileName);                        // 文件新名字
                fileInfo.setRelativePath(relativePath + newFileName);    // 文件相对路径
                fileInfo.setFilePath(path + relativePath + newFileName); // 文件物理路径
                fileInfo.setBizType(bizType);
                fileInfo.setBizId(bizId);
                fileInfo.setDelFlag(false);
                // 存储文件并记录到数据库
                try {
                    FileCopyUtils.copy(mpf.getBytes(), new FileOutputStream(fileInfo.getFilePath()));
                    fileConfDao.insert(fileInfo); 
                } catch (IOException e) {
                    log.error("upload file error!", e);
                    return null;
                }
                files.add(fileInfo);
            }
            return files;
        }
        private boolean validateFileInfo(List<MultipartFile> mpfList, FileConf fileConf) {
            if (mpfList == null || fileConf == null) { return false; }
            for (MultipartFile mpf : mpfList) {
                // 验证文件大小是否超出配置大小
                if (!StringUtils.isEmpty(fileConf.getFileSizeLimit()) && mpf.getSize() / 1024 > Integer.parseInt(fileConf.getFileSizeLimit())) {
                    return false;
                }
                // 验证文件类型是否符合文件配置的要求
                if (!StringUtils.isEmpty(fileConf.getFileTypeLimit()) && fileConf.getFileTypeLimit().indexOf(mpf.getContentType()) < 0) {
                    return false;
                }
            }
            return true;
        }
    }
    

    4.4.controller层

    ****简单controller****

    @RestController
    public class FileUploadController {
        @Resource
        private FileUploadService fileUploadService;
        /**
         * 文件上传接口
         * @param request  
         * @param bizType 业务类型(必传)
         * @param bizId   业务id
         * @param extraPath  额外的路径,首部和结尾不能带斜杠'/'
         * @return
         */
        @RequestMapping(value ="/uploadFile", method = RequestMethod.POST)
        public List<FileInfo> uploadFile(MultipartHttpServletRequest request, String bizType, Long bizId, String extraPath) {
            int count = 0;
            List<FileInfo> result = this.fileUploadService.uploadFile(request.getMultiFileMap().get("fileData"), bizType, bizId, extraPath);
            return result;
        }
    }
    

    4.5.html测试代码

    使用postman测试更简单,记得考虑跨越问题
    引用博客https://www.cnblogs.com/tianyuchen/p/5594641.html

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
        <title>fileUpload Test</title>
        <script type="text/javascript">
            var xhr;
            var ot;//
            var oloaded;
            //上传文件方法
            function upladFile() {
                var url = "http://127.0.0.1:8080/uploadFile"; // 接收上传文件的后台地址 
                
                var form = new FormData(); // FormData 对象
                var fileObj = document.getElementById("file").files; // js 获取文件对象
                if (fileObj != null) {
                    for (var i=0; i< fileObj.length; i++) {
                        form.append('fileData', fileObj[i], fileObj[i].name);
                    }
                }
                xhr = new XMLHttpRequest();  // XMLHttpRequest 对象
                xhr.open("post", url, true); //post方式,url为服务器请求地址,true 该参数规定请求是否异步处理。
                xhr.onload = uploadComplete; //请求完成(成功)
                xhr.onerror =  uploadFailed; //请求失败
                xhr.upload.onprogress = progressFunction;        //【上传进度调用方法实现】
                xhr.upload.onloadstart = function(){            //上传开始执行方法(初始)
                    ot = new Date().getTime();                   //设置上传开始时间
                    oloaded = 0;                                //设置上传开始时,以上传的文件大小为0
                };
                xhr.send(form); 
            }
            //上传进度实现方法,上传过程中会频繁调用该方法
            function progressFunction(evt) {
                 var progressBar = document.getElementById("progressBar");
                 var percentageDiv = document.getElementById("percentage");
                 // event.total是需要传输的总字节,event.loaded是已经传输的字节。如果event.lengthComputable不为真,则event.total等于0
                 if (evt.lengthComputable) {        
                     progressBar.max = evt.total;
                     progressBar.value = evt.loaded;
                     percentageDiv.innerHTML = Math.round(evt.loaded / evt.total * 100) + "%";
                 }
                
                var time = document.getElementById("time");
                var nt = new Date().getTime();//获取当前时间
                var pertime = (nt-ot) / 1000; //计算出上次调用该方法时到现在的时间差,单位为s
                ot = new Date().getTime(); //重新赋值时间,用于下次计算
                
                var perload = evt.loaded - oloaded; //计算该分段上传的文件大小,单位b       
                oloaded = evt.loaded;//重新赋值已上传文件大小,用以下次计算
            
                //上传速度计算
                var speed = perload / pertime; //单位b/s
                var bspeed = speed;
                var units = 'b/s';//单位名称
                if(speed/1024 > 1){
                    speed /= 1024;
                    units = 'k/s';
                }
                if(speed/1024 > 1){
                    speed /= 1024;
                    units = 'M/s';
                }
                speed = speed.toFixed(1);
                //剩余时间
                var resttime = ((evt.total - evt.loaded) / bspeed).toFixed(1);
                time.innerHTML = ',速度:' + speed + units + ',剩余时间:' + resttime + 's';
                if(bspeed == 0)
                time.innerHTML = '上传已取消';
            }
            //上传成功响应
            function uploadComplete(evt) {
                alert("上传成功!");
            }
            //上传失败
            function uploadFailed(evt) {
                alert("上传失败!");
            }
             //取消上传
            function cancleUploadFile(){
                xhr.abort();
            }
        </script>
    </head>
    <body>
        <progress id="progressBar" value="0" max="100" style="width: 300px;"></progress>
        <span id="percentage"></span><span id="time"></span>
        <br /><br />
        <input type="file" id="file" name="myfile" multiple="multiple"/>
        <input type="button" onclick="upladFile()" value="上传(多选)" />
        <input type="button" onclick="cancleUploadFile()" value="取消" />
    </body>
    </html>
    

    跨域问题解决

        @Bean
        public WebMvcConfigurer corsConfigurer() {
            return new WebMvcConfigurerAdapter() {
                @Override
                public void addCorsMappings(CorsRegistry registry) {
                    registry.addMapping("/**")
                            .allowedMethods("PUT", "DELETE","GET","POST")
                            .allowedHeaders("*")
                            .exposedHeaders("access-control-allow-headers",
                                    "access-control-allow-methods",
                                    "access-control-allow-origin",
                                    "access-control-max-age",
                                    "X-Frame-Options")
                            .allowCredentials(false).maxAge(3600);
                }
            };
        }
    

    4.最后

    综上一个根据配置规则定义的公用上传文件设计便完成了,这样我们项目所有和上传文件相关的业务都可以使用该接口,只需要简单的在数据库中配置下和业务相关的信息便可。当然可能有些业务还需要更细的定制,如要指定存储服务器,是否需要压缩,一定时间内需要删除文件等等,那你只需在该设计上添加新的配置字段,然后实现对该配置字段的支持就行了。



    、﹗∕
    — 〇 -
    ╱︱ ヽ
    但行好事、莫问前程!
    >.freerme、我是lilee[https://blog.csdn.net/freerme]
    _________________ *_*______
    ____ ____ ____
    展开全文
  • beego发送邮件和上传文件接口

    千次阅读 2018-12-08 10:12:32
    本文主要介绍采用beego框架的邮件发送和文件上传接口 在models中定义好请求参数模型和返回结果模型 type SmtpRecv struct { From string `json:&amp;quot;from&amp;quot;` To []string `json:&amp...

    本文主要介绍采用beego框架的邮件发送和文件上传接口
    发送邮件用到"gopkg.in/gomail.v2"包
    在models中定义好请求参数模型和返回结果模型

    type SmtpRecv struct {
       From        string   `json:"from"`
       To          []string `json:"to"`
       Cc          []string `json:"cc"`
       Pwd         string   `json:"pwd"`
       Attachments []string `json:"attachments"`
       Subject string `json:"subject"`
       Body    string `json:"body"`
    }
    

    返回结果模型如下,其中code 含义 1 成功 0 失败

    type GeneralResp struct {
       Code  int         `json:"code"`
       Data  interface{} `json:"data"`
       Error string      `json:"error"`
    }
    

    beego框架API接口

    type SendController struct {
       beego.Controller
    }
    
    func (this *SendController) SendMessage() {
       var smtpRecv models.SmtpRecv
       err := json.Unmarshal(this.Ctx.Input.RequestBody, &smtpRecv)
       if err != nil {
          log4go.Error(err.Error(), "smtpRecv RequestBody error")
          this.Data["json"] = models.GeneralResp{Code: 0, Error: err.Error()}
          this.ServeJSON()
          return
       }
    
       // send email
       err = smtpPush(smtpRecv)
       if err != nil {
          this.Data["json"] = models.GeneralResp{Code: 0, Error: err.Error()}
       } else {
          if len(smtpRecv.Attachments) != 0 {
             tools.RemoveFile(smtpRecv.Attachments)
          }
          this.Data["json"] = models.GeneralResp{Code: 1, Error: "send email success!"}
       }
       this.ServeJSON()
    
    }
    
    func smtpPush(smtpRecv models.SmtpRecv) error {
       m := gomail.NewMessage()
       m.SetHeaders(map[string][]string{
          "From":    {smtpRecv.From},
          "To":      smtpRecv.To,
          "Cc":      smtpRecv.Cc,
          "Subject": {smtpRecv.Subject},
       })
       //m.Attach()
       m.SetBody("text/html", smtpRecv.Body)
       if len(smtpRecv.Attachments) != 0 {
          for k, _ := range smtpRecv.Attachments {
             m.Attach(smtpRecv.Attachments[k])
          }
       }
    
       port, err := beego.AppConfig.Int("sendmsgport")
       if err != nil {
          log4go.Error(err.Error())
          return err
       }
    
       d := gomail.NewDialer(Host: "smtp.qq.com", Port: 465, Username: "1910732668@qq.com", Password: "***********",SSL:true)
    
       // Send the email
       if err := d.DialAndSend(m); err != nil {
          log4go.Error(err.Error())
          return err
       }
       return nil
    }
    
    type Sizer interface {
       Size() int64
    }
    
    func (this *SendController) UploadFiles() {
       f, h, err := this.GetFile("file") //获取上传的文件this.GetFile("file")
       if err != nil {
          this.Data["json"] = models.GeneralResp{Code: 0, Error: "get file fail!"}
          this.ServeJSON()
          return
       }
       defer f.Close() //关闭上传的文件,不然的话会出现临时文件不能清除的情况
       ext := path.Ext(h.Filename)
       //验证后缀名是否符合要求
       var AllowExtMap map[string]bool = map[string]bool{
          ".jpg":  true,
          ".jpeg": true,
          ".png":  true,
          ".gif":  true,
          ".csv":  true,
          ".docx": true,
          ".xlsx": true,
          ".xls":  true,
          ".doc":  true,
          ".pdf":  true,
          ".txt":  true,
          ".html": true,
          ".ppt":  true,
          ".pptx": true,
       }
       var Filebytes = 1 << 24 //文件小于16兆
       if _, ok := AllowExtMap[ext]; !ok {
          this.Data["json"] = models.GeneralResp{Code: 0, Error: "not allowed file format!"}
          this.ServeJSON()
          return
       }
    
       if fileSizer, ok := f.(Sizer); ok {
          fileSize := fileSizer.Size()
          if fileSize > int64(Filebytes) {
             this.Data["json"] = models.GeneralResp{Code: 0, Error: "upload file error: file size exceeds 16M!"}
             this.ServeJSON()
          } else {
             uploadDir := "./upload/" + time.Now().Format("2006/01/02/")
             err = os.MkdirAll(uploadDir, os.ModePerm)
             if err != nil {
                this.Data["json"] = models.GeneralResp{Code: 0, Error: "create upload dir fail:" + err.Error()}
                this.ServeJSON()
                return
             }
             fpath := uploadDir + h.Filename
             err = this.SaveToFile("file", fpath)
             if err != nil {
                this.Data["json"] = models.GeneralResp{Code: 0, Error: err.Error()}
                this.ServeJSON()
                //this.Ctx.WriteString(fmt.Sprintf("%v", err))
             }
             this.Data["json"] = models.GeneralResp{Code: 1, Data: fpath}
             this.ServeJSON()
          }
       } else {
          this.Data["json"] = models.GeneralResp{Code: 0, Error: "unable to read file size!"}
          this.ServeJSON()
       }
    
    }
    

    如有不对欢迎指正,相互学习,共同进步。

    展开全文
  • Python 上传文件接口

    2020-03-27 00:43:17
    接口根据上传的内容不一致,content-type的类型是客户端告诉服务器,接下来我将要发送什么类型的文件给你处理。可以html,xml.视频,图像等。 具体需要使用什么数据,则根据你传送的文件类型 具体的content-type的...

    接口根据上传的内容不一致,content-type的类型是客户端告诉服务器,接下来我将要发送什么类型的文件给你处理。可以html,xml.视频,图像等。
    具体需要使用什么数据,则根据你传送的文件类型
    具体的content-type的参数对照表如链接 HTTP Content-type
    同时了解报文头:Content-Disposition 有利于使用Python写关于SMTP邮件发送功能的理解

    #需要使用的库如下,注意大小写区分
    from requests_toolbelt.multipart.encoder import MultipartEncoder
    import requests
    
    #报文头
    header = {
    "Content-Type":msg_content.content_type, 
    "User-Agent": useAgent是浏览器自带向客户端发送的自我认证,通俗来说就是告诉服务器,我是通过某某浏览器什么内核什么操作系统去访问你的
    "Referer":要上传的服务器的ip地址
    
    msg_content = MultipartEncoder{
    	 fields={
            "businessType": 忽略的字段,具体是由具体的接口字段进行替换
            "userId": 可以忽略,这个是由开发定义的字段
            "file": (
                "自命名上传的文件名", open('打开本地要上传的文本', 'rb'), 'application/vnd.ms-excel')
        },
        boundary="查看上述链接Content-Disposition的作用"
    }
    
    #最后调用请求的上传的接口
    res = requests.request("POST","接口地址",data=msg_content, headers=header)
    
    print(res.text)
    
    
    
    

    概述:文件的上传及下载,不同于普通的接口处理,不能简单的使用post,data,header进行请求

    展开全文
  • Fiddler小技巧-测试上传文件接口

    万次阅读 2016-08-23 14:41:20
    相信用过Fiddler的同学都清楚,Fiddler是个强大好用的调试工具 当服务器端的同学把服务器布置好后,移动端的同学如果要先写好代码再一个一个的对...这里以上传图片为例,介绍下如何使用Fiddler测试上传文件接口打开F
  • API接口 模型类 系统的文件信息(图片、文档等小文件的信息)在mongodb中存储,下边是文件信息的模型类。 1) 模型如下: package com.learn.framework.domain.filesystem; import lombok.Data; import lombok....
  • spring cloud feign接口上传文件

    千次阅读 2019-01-28 18:48:54
    最近在使用Spring Cloud封装的Feign,自己在项目中暴露的feign接口中有一个接口上传文件的,使用了常规的@RequsetParam去获取,然后报错:  The current request is not a multipart request 然后以为是自己...
  • Springboot后端接口开发-文件上传接口

    千次阅读 2020-06-30 10:29:56
    Springboot后端接口开发-文件上传下载接口 这里写目录标题Springboot后端接口开发-文件上传下载接口主要思路具体实现 主要思路 在项目实训管理系统的开发过程中我们需要对于某些学生上传的阶段性报告进行保存,以及...
  • Java文件上传接口

    千次阅读 2020-05-03 21:58:12
    1. Java单文件上传接口 import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; import java.io.File; import java.text.SimpleDateFormat; import java.util....
  • v8接口定义.txt

    2020-07-24 00:07:12
    jlink v8 下载器 仿真器 pcb+原理图 同时上传有hex文件 可以diy自己制作 有激活方法 按照txt的说明顺序即可
  • @ApiOperation(value = "统一对外接口") @ArchivesLog(operationType = "保存更新", operationName = "统一对外接口") public ReturnMsg fritRptDataDock(String jsonDataStr, @RequestParam("fi.
  • 最近接到了做在线文档编辑的需求,普通的rpc接口比如dubbo或者spring cloud的feign... // upload_url为上传文件接口调用地址 HttpPost httpPost = new HttpPost(upload_url); // 使用try resource进行httpClient...
  • @ApiOperation(value = "上传", notes = "上传") @ApiImplicitParam(paramType = "form", name = "file", value = "文件对象", required = true, dataType = "__file") public void insert(@...多文件上传: .
  • 接口测试——并行上传文件

    千次阅读 2018-08-03 14:23:21
    任务目标:用requests构造一个上传文件接口测试,文件从一个文件夹里面取,可以并发上传多个文件 一、分解任务: ①使用requests构造一个上传文件接口测试。 ②实现遍历上传测试文件,作为并发上传的效率对比...
  • Multipart接口的实现类CommonsMultipartFile类,有个保存文件到新路径的方法transferTo(),调用了FileItem接口的方法write(),FileItem接口的实现类DiskFileItem类二.MultipartFile接口源码如下:public interface.....
  • 接口测试的工作,我们时常需要对参数进行B64编码。今天我们以聚合数据的“身份证OCR识别”接口,来实现对身份证图片的B64编码加密后传递。 用到的技术:外jar包调用和BeanShell 预处理程序 1、添加外包jar 我们...
  • PHP文件上传接口(带参数)

    千次阅读 2017-06-20 14:23:12
    简单讲解下PHP服务端接受客户端上传文件 客户端上传文件到服务器,带参数,并且进行用户验证,方法很简单直接贴代码
  • element-ui upload 多文件接口上传

    千次阅读 2019-06-27 17:05:47
    最近在使用element-ui upload 上传多个文件的时候发现element-ui的批量上传是每个文件都请求一次接口,但是我们项目的需求是多个文件只请求一次接口.细思良久,经过一番奋战,终于实现了这个需求. 下面直接上代码 //...
  • 往常的接口测试都是get或者post请求进行接口测试,但遇到需要上传文件的操作。遇到了很多坑 坑1:data的构造 这个例子可以在开发者模式里看到字典的构造包含4个key,但是能看到filename的文件地址并不是真实地址,...
  • //获取上传文件在服务上默认的文件名  // }//TODO:这样做直接就将文件存到了指定目录下,暂时不知道如何实现只接收文件数据流但并不保存至服务器的目录下,由开发自行指定如何存储,比如通过服务存到图片服务器 ...
  • 微信公众号上传多媒体文件接口用JAVA怎么实现 微信公众号图片上传 根据图片的描述是通过发送https请求上传图片。微信公众号提供的文档是通过curl命令来实现发送https post请求,但是我现在的程序是通过...
  • 在Spring MVC(4.3.8)下使用HttpClient(4.5.3)调用企业微信的上传临时素材文件的接口失败,错误消息为:empty media data 接口定义参见企业微信开发文档:https://work.weixin.qq.com/api/doc#10112 分析 纯属...
  • 1. 文件上传 请求 url: http://pan.fezo.com.cn/task/file/up 请求参数: 参数 1:文件数据 data; 服务器返回值: 服务器返回{retCode:0,fileId:xxxxxx}为创建成功,否则失败。 备注: 客户端需保证文件名的唯一...
  • Vue 项目实战上传文件接口OPTIONS

    千次阅读 2019-04-18 08:54:52
    2. 上传文件 项目中需要导入 Excel 数据功能,这里直接使用的是 Element 的 Upload 组件 。 class="reset-btn" type="primary" icon="iconfont icon-import" size="small" plain >批量导入 如上所...
  • 文件变成流文件 上传到第三方接口@RequestMapping(value={"/uploadFile"},method = {RequestMethod.POST}) public RespEntity uploadFile(String ticket_id, MultipartFile file) throws Exception ...
  • Jersey开发Restful的文件上传接口如何传递数组参数 一般Rest接口如何传递数组参数? 需要传递数组参数的情况,如果是一般的form表单,可以直接定义参数类型为List<String>即可(不能定义为数组类型,否则...
  • 本文提供是思路,由于具体文件上传的代码很简单, 不贴代码,如有疑问留言告知在下~ 前提背景 多文件上传, 用户可以选择[0,n]个文件 这些文件可以基于某种规则进行区分,并且需要进行区分 比如 前端页面有A,B两个...
  • //这里读取的是上边url对应的上传文件接口的返回值,读取出来后,然后接着返回到前端,实现接口中调用接口的方式 } } catch (Exception e) { System.out.println("发送POST请求出现异常!" + e); e....
  • 使用element-ui的上传组件时,你使用的是自动上传(即选择完文件就立马上传),即使你设置了属性 :multiple=true,但是请求接口的时候还是分开请求的,你选了几个文件就请求几次,那我们要如何请求一次,把文件和自己...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 129,942
精华内容 51,976
关键字:

上传文件接口定义