返回顶部
首页 > 资讯 > 后端开发 > Python >Java实现文件分片上传接口的示例代码
  • 174
分享到

Java实现文件分片上传接口的示例代码

2024-04-02 19:04:59 174人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录java后端分片上传接口前端分片java后端分片上传接口 文件上传工具--FileUtil package com.youmejava.chun.util; import l

java后端分片上传接口

文件上传工具--FileUtil


package com.youmejava.chun.util;

import lombok.Data;
import org.apache.Tomcat.util.Http.fileupload.FileUtils;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.NIO.channels.FileChannel;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;



@Data
public class FileUtil {
    private List<File> filelist;//文件列表
    private String strPath;//路径

    public FileUtil() {
    }

    public FileUtil(List<File> filelist, String strPath) {
        this.filelist = filelist;
        this.strPath = strPath;
        getFileList(this.strPath);
    }

    
    public List<File> getFileList(String strPath) {
        File dir = new File(strPath);
        File[] files = dir.listFiles(); // 该文件目录下文件全部放入数组
        if (files != null) {
            for (int i = 0; i < files.length; i++) {
                String fileName = files[i].getName();
                if (files[i].isDirectory()) { // 判断是文件还是文件夹
                    getFileList(files[i].getAbsolutePath()); // 获取文件绝对路径
                } else  { // 判断文件名
                    String strFileName = files[i].getAbsolutePath();
                    //                    System.out.println("---" + strFileName);
                    filelist.add(files[i]);
                }
            }

        }
        return filelist;
    }

    
    public static void mergeFile(String from, String to) throws IOException {
        File t = new File(to);
        FileInputStream in = null;
        FileChannel inChannel = null;
        System.out.println("t "+t);

        FileOutputStream out = new FileOutputStream(t,true);
        FileChannel outChannel = out.getChannel();

        File f = new File(from);
        System.out.println("f "+f.isDirectory());
        // 获取目录下的每一个文件名,再将每个文件一次写入目标文件
        if (f.isDirectory()) {
            List<File> list = getAllFileAndSort(from);
            System.out.println("sortlist  "+list);
            // 记录新文件最后一个数据的位置
            long start = 0;
            for (File file : list) {

                in = new FileInputStream(file);
                inChannel = in.getChannel();

                // 从inChannel中读取file.length()长度的数据,写入outChannel的start处
                outChannel.transferFrom(inChannel, start, file.length());
                start += file.length();
                in.close();
                inChannel.close();
            }
        }
        out.close();
        outChannel.close();
    }

    
    public static List<File> getAllFileAndSort(String dirPath) {
        File dirFile = new File(dirPath);
        File[] listFiles = dirFile.listFiles();
        List<File> list = Arrays.asList(listFiles);
        Collections.sort(list, (o1, o2) -> {
            String _str=o1.getName().split("\\.")[0];
            String _num=_str.split("_")[1];
            String _str2=o2.getName().split("\\.")[0];
            String _num2=_str2.split("_")[1];
            return Integer.parseInt(_num) - Integer.parseInt(_num2);
        });
        return list;
    }

    
    public static boolean deleteDirectory(String directory) {
        // directory不以文件分隔符(/或\)结尾时,自动添加文件分隔符,不同系统下File.separator方法会自动添加相应的分隔符
        if (!directory.endsWith(File.separator)) {
            directory = directory + File.separator;
        }
        File directoryFile = new File(directory);
        // 判断directory对应的文件是否存在,或者是否是一个文件夹
        if (!directoryFile.exists() || !directoryFile.isDirectory()) {
            System.out.println("文件夹删除失败,文件夹不存在" + directory);
            return false;
        }
        boolean flag = true;
        // 删除文件夹下的所有文件和文件夹
        File[] files = directoryFile.listFiles();
        for (int i = 0; i < files.length; i++) {  // 循环删除所有的子文件及子文件夹
            // 删除子文件
            if (files[i].isFile()) {
                flag = deleteFile(files[i].getAbsolutePath());
                if (!flag) {
                    break;
                }
            } else {  // 删除子文件夹
                flag = deleteDirectory(files[i].getAbsolutePath());
                if (!flag) {
                    break;
                }
            }
        }

        if (!flag) {
            System.out.println("删除失败");
            return false;
        }
        // 最后删除当前文件夹
        if (directoryFile.delete()) {
            System.out.println("删除成功:" + directory);
            return true;
        } else {
            System.out.println("删除失败:" + directory);
            return false;
        }
    }

    
    public static boolean deleteFile(String fileName) {
        File file = new File(fileName);
        if (file.isFile() && file.exists()) {
            file.delete();
            System.out.println("删除文件成功:" + fileName);
            return true;
        } else {
            System.out.println("删除文件失败:" + fileName);
            return false;
        }
    }

}

分片上传文件接口

 package com.youmejava.chun.commoninterface;

import com.youmejava.chun.util.FileUtil;
import com.youmejava.chun.util.ResultVo;
import com.youmejava.chun.util.StringUtil;
import io.swagger.annotations.api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.apache.shiro.authc.ExpiredCredentialsException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.WEB.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultiparthttpservletRequest;

import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("/api/apiSystem/upload")
@Api(value = "文件上传", tags = "文件上传")
public class UploadController {

    @Value("${filePath1}")
    private String filePath;

    @PostMapping("/reGISter")
    @ApiOperation(value = "文件注册", notes = "文件注册")
    @ApiImplicitParams({@ApiImplicitParam(value = "哈希值", name = "hash", required = true, paramType = "body")})
    public ResultVo register(@RequestBody Map<String, Object> map) {
        System.out.println("hash: " + map.get("hash"));
        if (!StringUtil.isNotBlankAndNull(map.get("hash").toString())) {
            //            return ResultVo.failure("哈希值不可为空");
            throw new ExpiredCredentialsException("哈希值不可为空!");
        }
        String _filePath=filePath;
        if (!_filePath.endsWith("/")) {
            _filePath+="/";
        }
//        String _pathStr = "C:\\Users\\JH-rent\\Desktop\\java启动文件\\test" + "\\" + map.get("hash");
        String _pathStr=_filePath+map.get("hash");
        //创建不同的文件夹目录
        File file = new File(_pathStr);
        //判断文件夹是否存在
        if (!file.exists()) {
            //如果文件夹不存在,则创建新的的文件夹
            file.mkdirs();
        }
        File f = new File(_pathStr);

        // 检查目录是否已上传过文件,如果上传过,返回上传个数
        if (f.isDirectory()) {
            File dirFile = new File(_pathStr);
            File[] listFiles = dirFile.listFiles();
            List<File> list = Arrays.asList(listFiles);
            if (list == null&&list.size()>0) {
                Map<String, Object>map1=new HashMap<>();
                map1.put("number",list.size());
                return ResultVo.success(map1);
            }
        }


        return ResultVo.success();
    }

    @PostMapping("/uploadFile")
    @ResponseBody
    @ApiOperation(value = "上传文件", notes = "上传文件")
    @ApiImplicitParams({@ApiImplicitParam(value = "哈希值", name = "hash", required = true, paramType = "body"), @ApiImplicitParam(value = "文件流", name = "file", required = true, paramType = "body"), @ApiImplicitParam(value = "文件名称", name = "fileName", required = true, paramType = "body"),})
    public ResultVo uploadFile(HttpServletRequest request) {
        MultipartHttpServletRequest params = ((MultipartHttpServletRequest) request);
        List<MultipartFile> files = ((MultipartHttpServletRequest) request).getFiles("file");
        String _fileName = params.getParameter("fileName");
        String _hash = params.getParameter("hash");
        if (!StringUtil.isNotBlankAndNull(_hash)) {
            throw new ExpiredCredentialsException("哈希值不可为空!");
        }
        if (!StringUtil.isNotBlankAndNull(_fileName)) {
            throw new ExpiredCredentialsException("文件名称不可为空!");
        }
//        System.out.println("_fileName: " + _fileName);
//        System.out.println("_hash: " + _hash);
//        System.out.println("files: " + files);
//        System.out.println(params.getParameter("file"));
//        String _pathStr = "C:\\Users\\JH-rent\\Desktop\\java启动文件\\test" + "\\" + _hash + "\\";

        String _filePath=filePath;
        if (!_filePath.endsWith("/")) {
            _filePath+="/";
        }
        String _pathStr =_filePath+_hash+"/";

        FileOutputStream fileOut = null;
        //写入到文件(注意文件保存路径的后面一定要加上文件的名称)

        try {
            fileOut = new FileOutputStream(_pathStr + _fileName);
            BufferedOutputStream bos = new BufferedOutputStream(fileOut);
            BufferedInputStream bis = null;
            for (MultipartFile file : files) {
                //                file.transferTo(new File(_pathStr + file.getOriginalFilename()));
                //                System.out.println(file.getInputStream());
                bis = new BufferedInputStream(file.getInputStream());
            }

            byte[] buf = new byte[4096];
            int length = bis.read(buf);
            //保存文件
            while (length != -1) {
                bos.write(buf, 0, length);
                length = bis.read(buf);
            }
            bos.close();
            bis.close();
            return ResultVo.success();
        } catch (Exception e) {
            e.printStackTrace();
            return ResultVo.failure(e.getMessage());
        }

    }

    @GetMapping("/getMergeFile")
    @ApiOperation(value = "获取合并文件", notes = "获取合并文件")
    @ApiImplicitParams({@ApiImplicitParam(value = "哈希值", name = "hash", required = true, dataType = "String"), @ApiImplicitParam(value = "文件名称", name = "fileName", required = true, dataType = "String")})
    public ResultVo getMergeFile(@RequestParam(value = "hash") String hash, @RequestParam(value = "fileName") String fileName) {
//        String _pathStr = "C:\\Users\\JH-rent\\Desktop\\java启动文件\\test" + "\\" + hash + "\\";
//        String _pathStr1 = "C:\\Users\\JH-rent\\Desktop\\java启动文件\\test";

        String _filePath=filePath;
        if (!_filePath.endsWith("/")) {
            _filePath+="/";
        }
        String _pathStr = _filePath + hash + "/";
        String _pathStr1 = _filePath;
        try {
//            if (!_pathStr1.endsWith("\\")) {
//                _pathStr1 += "\\";
//            }
            _pathStr1 += fileName;
            FileUtil.mergeFile(_pathStr, _pathStr1);
            //合并成功删除加密文件
            FileUtil.deleteDirectory(_pathStr);
        } catch (IOException e) {
            e.printStackTrace();
        }
        Map<String, Object>map=new HashMap<>();
        map.put("fileUrl",_pathStr1);
        return ResultVo.success(map);
    }

}

前端分片

单个文件下载或者分批压缩多个文件下载

import jsZip from "jszip";
import fileSaver from "file-saver";
import axiOS from 'axios'
import {
  Message,
  Notification
} from "element-ui";


//下载单个文件
export const downloadSingleFile = (url, filename) => {
  filename = filename || "文件名";
  let suffix = /\.([0-9a-zA-Z]+)$/i.exec(url)[1];
  const file_type = {
    'doc': 'application/msWord',
    'bin': 'application/octet-stream',
    'exe': 'application/octet-stream',
    'so': 'application/octet-stream',
    'dll': 'application/octet-stream',
    'pdf': 'application/pdf',
    'ai': 'application/postscript',
    'xls': 'application/vnd.ms-excel',
    'ppt': 'application/vnd.ms-powerpoint',
    'dir': 'application/x-director',
    'js': 'application/x-javascript',
    'swf': 'application/x-shockwave-flash',
    'xhtml': 'application/xhtml+xml',
    'xht': 'application/xhtml+xml',
    'zip': 'application/zip',
    'mid': 'audio/midi',
    'midi': 'audio/midi',
    'mp3': 'audio/mpeg',
    'rm': 'audio/x-pn-realaudio',
    'rpm': 'audio/x-pn-realaudio-plugin',
    'wav': 'audio/x-wav',
    'bmp': 'image/bmp',
    'gif': 'image/gif',
    'jpeg': 'image/jpeg',
    'jpg': 'image/jpeg',
    'png': 'image/png',
    'CSS': 'text/css',
    'html': 'text/html',
    'htm': 'text/html',
    'txt': 'text/plain',
    'xsl': 'text/xml',
    'xml': 'text/xml',
    'mpeg': 'video/mpeg',
    'mpg': 'video/mpeg',
    'avi': 'video/x-msvideo',
    'movie': 'video/x-sgi-movie',
  }

  return new Promise((resolve, reject) => {
    console.log(url, "url");
    axios
      .get(url, {
        responseType: 'blob',
      })
      .then((res) => {
        const blob = new Blob([res.data], {
          type: file_type[suffix]
        }) // 构造一个blob对象来处理数据,并设置文件类型
        if (window.navigator.msSaveOrOpenBlob) {
          // 兼容IE10
          navigator.msSaveBlob(blob, filename)
        } else {
          const href = URL.createObjectURL(blob) // 创建新的URL表示指定的blob对象
          const a = document.createElement('a')
          a.style.display = 'none'
          a.href = href // 指定下载链接
          a.download = filename // 指定下载文件名
          a.click()
          URL.revokeObjectURL(a.href) // 释放URL对象
          a.remove();
        }
        resolve("下载成功!")
      })
  })



}


let file_num = 0;
const zip = new JSZip();
let zip_obj = [];
let floder_obj = [];
let file_order = 0;
let file_floder = null;
let file_data = [];
let file_title = "";
let cur_title = "";
let breakpoint_num = 500; //断点数据
let allowZipFile = true; //等待压缩完成

export const downloadCompressedFiles = ({
  paths = [],
  title = "文件批量下载",
  percentCallback = () => {},
}) => {
  allowZipFile = true;
  file_order = 0;
  cur_title = (title && title) || "文件批量下载";
  file_title = paths.length > breakpoint_num ? title ? `${title}文件第1~${breakpoint_num}个` : `文件批量下载文件1~${breakpoint_num}个` : (title && title) || "文件批量下载";
  zip_obj[file_order] = new JSZip();
  floder_obj[file_order] = zip_obj[file_order].folder(file_title);
  // file_floder = zip.folder((title && title) || "文件批量下载");
  file_num = 0;

  if (paths.length) {
    file_data = paths;
    if (file_num < paths.length) {
      getUrlBlod(paths[file_num].path, paths[file_num].name, percentCallback);
    }
  }

}

const getUrlBlod = (url, name, percentCallback = () => {}) => {
  // 从url获取文件后缀
  let suffix = /\.([0-9a-zA-Z]+)$/i.exec(url)[1];
  let promise = httpPost({
    url
  }).then((data) => {
    console.log(file_order, "data123");
    // console.log(floder_obj[file_order]);
    floder_obj[file_order].file(`${name}.${suffix}`, data, {
      binary: true
    }); //逐个添加文件
    file_num = file_num + 1;
    if (file_num != file_data.length) {
      if (file_num % breakpoint_num == 0) {
        let _temp = file_order;
        file_order = file_order + 1;
        // file_title = (breakpoint_num + file_num) <= file_data.length ? `${cur_title}文件第${breakpoint_num*_temp}~${file_num}个` : `${cur_title}文件第${file_num}~${file_data.length}个`;
        file_title=`${cur_title}文件第${breakpoint_num*_temp}~${file_num}个`;
        zip_obj[file_order] = new JSZip();
        floder_obj[file_order] = zip_obj[file_order].folder((file_title && file_title) || "文件批量下载");
        Notification({
          title: '提示',
          message: file_title + '开始压缩文件中!请等待',
          type: 'info',
          duration: 0
        });
        allowZipFile = false;
        zipGenerateAsync(_temp, percentCallback);
      }
      percentCallback(file_num)
      if (allowZipFile) {
        getUrlBlod(file_data[file_num].path, file_data[file_num].name, percentCallback);
      }
    } else {
      if (file_num >= file_data.length) {
        file_title = `${cur_title}文件第${breakpoint_num * file_order}~${file_data.length}个`;
      }
      let _temp = file_order;
      Notification({
        title: '提示',
        message: file_title + '开始压缩文件中!请等待',
        type: 'info',
        duration: 0
      });
      allowZipFile = false;
      zipGenerateAsync(_temp, percentCallback);
    }
    return file_num;
  }).catch(err => {
    // console.log(err, "err123");
    // Message.error(`${name}文件下载失败!`);
    file_num = file_num + 1;
    if (file_num != file_data.length) {
      if (file_num % breakpoint_num == 0) {
        let _temp = file_order;
        file_order = file_order + 1;
        // file_title = (breakpoint_num + file_num) <= file_data.length ? `${cur_title}文件第${breakpoint_num*_temp}~${file_num}个` : `${cur_title}文件第${file_num}~${file_data.length}个`;
        file_title=`${cur_title}文件第${breakpoint_num*_temp}~${file_num}个`;
        zip_obj[file_order] = new JSZip();
        floder_obj[file_order] = zip_obj[file_order].folder(file_title);
        Notification({
          title: '提示',
          message: file_title + '开始压缩文件中!请等待',
          type: 'info',
          duration: 0
        });
        allowZipFile = false;
        zipGenerateAsync(_temp, percentCallback);
      }
      percentCallback(file_num)
      if (allowZipFile) {
        getUrlBlod(file_data[file_num].path, file_data[file_num].name, percentCallback);
      }

    } else {
      if (file_num >= file_data.length) {
        file_title = `${cur_title}文件第${breakpoint_num * file_order}~${file_data.length}个`;
      }
      Notification({
        title: '提示',
        message: file_title + '开始压缩文件中!请等待',
        type: 'info',
        duration: 0
      });
      let _temp = file_order;
      allowZipFile = false;
      zipGenerateAsync(_temp, percentCallback);
    }
  });

}

const zipGenerateAsync = (num, percentCallback = () => {}) => {
  zip_obj[num].generateAsync({
    type: "blob"
  }).then((content) => {

    Notification({
      title: '成功',
      message: file_title + '压缩文件下载成功',
      type: 'success',
      duration: 0
    });
    // 生成二进制流
    fileSaver.saveAs(
      content,
      (file_title && `${file_title}.zip`) || "文件批量下载.zip"
    ); // 利用file-saver保存文件
    // Message.error(`压缩文件下载成功!`);
    if (file_num == file_data.length) {
      file_num = file_num + 1;
    }

    percentCallback(file_num);
    zip_obj[num] = "";
    floder_obj[num] = "";
    if (file_num < file_data.length) {
      allowZipFile = true;
      getUrlBlod(file_data[file_num].path, file_data[file_num].name, percentCallback);
    }

    // Message({
    //   message: '压缩包文件下载成功!',
    //   type: 'success'
    // });
  }).catch(err => {
    console.log(err, "压缩下载失败");
    zip_obj[num] = "";
    floder_obj[num] = "";
    allowZipFile = true;
    getUrlBlod(file_data[file_num].path, file_data[file_num].name, percentCallback);
    Notification.error({
      title: '错误',
      message: file_title + '压缩下载失败',
      duration: 0
    });
  });
}

const getInPath = (url, name = "") => {
  return new Promise(async (resolve, reject) => {
    // let result = await axiosDownload(url);
    // if (result) {
    //   resolve(result.data);
    // } else {
    //   reject();
    // }
    await axiosDownload(url).then(res => {
      resolve(res.data)
    }).catch(err => {
      reject(err)
    })
  });
};

const axiosDownload = (url, resOpts = {}) => {
  const {
    type = "get", data = ""
  } = resOpts;
  const queryArgs = {
    url,
    method: type,
    data,
    responseType: "blob",
    // headers: {//这个地方看情况而定,如果打开会存在跨域问题
    //   Accept: "application/JSON",
    //   "Content-Type": "application/json; charset=utf-8",
    //   withCredentials: true,
    // },
  };
  // tips: 这里直接返回的是response整体!
  return new Promise((resolve, reject) =>
    axios
    .request(queryArgs)
    .then((res) => resolve(res))
    .catch((err) => reject(err))
  );
};



const axiosConfig = {
  // headers: {
  //   'Content-Type': 'application/json;charset=UTF-8',
  // },
  // timeout: 60000,
  responseType: 'blob',
}

const request = axios.create(axiosConfig);

let isRefreshing = false;
let queue = [];

let runQueue = () => {
  isRefreshing = true
  let first = queue.shift();
  first.request()
}

//请求拦截
//所有的网络请求都会先走这个方法
// 添加请求拦截器,所有的网络请求都会先走这个方法,我们可以在它里面为请求添加一些自定义的内容
request.interceptors.request.use((config) => {
  // 在发送请求之前做些什么
  return config;
}, function (error) {
  return Promise.reject(error);
});

// 添加响应拦截器
request.interceptors.response.use(function (response) {
  isRefreshing = false
  if (!(queue.length === 0)) runQueue()
  return response.data
}, function (error) {
  console.log(error, 2343);
  isRefreshing = false
  if (!(queue.length === 0)) runQueue()
  // 对响应错误做点什么
  return Promise.reject(error);
});

const httpPost = async ({
  url,
  method = 'get',
  data = "",
}) => {
  return new Promise((resolve, reject) => {
    queue.push({
      request: () => {
        request({
          method,
          url,
          data,
        }).then(res => {
          resolve(res)
        }).catch(e => {
          reject(e)
        })
      }
    })
    if (!isRefreshing) runQueue()
  })
}

以上就是Java实现文件分片上传接口的示例代码的详细内容,更多关于Java文件分片上传的资料请关注编程网其它相关文章!

--结束END--

本文标题: Java实现文件分片上传接口的示例代码

本文链接: https://lsjlt.com/news/165179.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java实现文件分片上传接口的示例代码
    目录java后端分片上传接口前端分片java后端分片上传接口 文件上传工具--FileUtil package com.youmejava.chun.util; import l...
    99+
    2024-04-02
  • SpringBoot文件分片上传的示例代码
    目录背景文件MD5计算文件分片切割文件分片接收检查分片保存分片合并分片云文件分片上传阿里云OSS华为云OBSMinio背景 最近好几个项目在运行过程中客户都提出文件上传大小的限制能否...
    99+
    2024-04-02
  • Vue实现文件切片上传功能的示例代码
    目录流程简说获取文件的 MD5 唯一标识码文件切片获取文件名 name分片文件大小 chunkSize文件切片 chunkList 列表切片总数 chunks切片大小 size合并在...
    99+
    2022-11-13
    Vue文件切片上传 Vue文件切片
  • Nodejs实现文件上传的示例代码
    笔者用nodejs做项目时需要用到文件上传的功能,在网上搜索了很多教程,找到了一个express的中间件,用于处理 multipart/form-data 类型的表单数据,可以很方便的将表单中的文件数据保存...
    99+
    2022-06-04
    示例 文件上传 代码
  • PHP+JS实现文件分块上传的示例代码
    目录一、分块上传流程二、实现代码HTMLJSPHP我们在上传大文件时,可能会由于服务器的原因导致文件上传失败,文件过大时由于服务器的配置或响应事件过长导致上传文件失败,这时候我们可以...
    99+
    2022-11-13
    PHP JS文件分块上传 PHP 文件分块上传 PHP 文件上传
  • Java实现文件分片上传
    起因:最近在工作中接到了一个大文件上传下载的需求,要求将文件上传到share盘中,下载的时候根据前端传的不同条件对单个或多个文件进行打包并设置目录下载。 一开始我想着就还是用老办法直接file.transferTo(newFile)就算是大...
    99+
    2023-08-18
    Java 分片上传 文件
  • layui中富文本图片上传接口与普通按钮文件上传接口的示例分析
    小编给大家分享一下layui中富文本图片上传接口与普通按钮文件上传接口的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!富...
    99+
    2024-04-02
  • SpringCloudFeign实现文件上传下载的示例代码
    目录独立使用Feign上传文件下载文件使用Spring Cloud Feign上传文件下载文件总结 Feign框架对于文件上传消息体格式并没有做原生支持,需要集成模块fei...
    99+
    2024-04-02
  • JavaSpringBoot实现文件上传功能的示例代码
    测试代码 pom.xml: <xml version="1.0" encoding="UTF-8"> <project xmlns="http://maven.ap...
    99+
    2024-04-02
  • GO语言实现文件上传的示例代码
    目录前言文件上传表单操作服务端操作流程实现小结前言 最近在写一个文件上传的功能,现在来进行整理总结一下go语言如何上传文件的,本文主要分享一下golang实现文件上传的流程和具体代码...
    99+
    2024-04-02
  • Vue+NodeJS实现大文件上传的示例代码
    目录整体思路项目演示前端界面文件切片hash计算查询切片状态切片上传(断点续传)文件总体上传进度合并文件优化请求并发数控制hash值计算优化常见的文件上传方式可能就是new一个For...
    99+
    2024-04-02
  • java后台接收app上传的图片的示例代码
    整理文档,搜刮出一个java后台接受app上传的图片的示例代码,稍微整理精简一下做下分享package com.sujinabo.file;import java.io.File;import java.io.FileOutputStrea...
    99+
    2023-05-31
    java app 上传图片
  • Java超详细大文件分片上传代码
    目录Java 大文件分片上传首先是交互的控制器上传文件分片参数接收大文件分片上传服务类实现文件分片上传定义公共服务类接口文件分片上传文件操作接口实现类OSS阿里云对象存储分片上传实现...
    99+
    2024-04-02
  • Go Gin实现文件上传下载的示例代码
    Go Gin 实现文件的上传下载流读取 文件上传 router router.POST("/resources/common/upload", service.Uploa...
    99+
    2022-06-07
    gin GO 示例 文件上传
  • PHP实现文件上传和下载的示例代码
    目录1.效果图2.首先是封装好的图片类(缩放及生成水印)1.GDBasic.php2.Image.php3.ajax类封装文件1.index.php2.图片相关功能处理3.封装好的文...
    99+
    2024-04-02
  • Golang实现图片上传功能的示例代码
    目录1.前端代码2.JS代码3.后端代码该代码为使用beego实现前后端图片上传。话不多说,直接上代码。 1.前端代码 html代码: <div class="col-5 f...
    99+
    2024-04-02
  • SpringMVC框架实现上传图片的示例代码
    一.创建图片虚拟目录在上传图片之前,先要设置虚拟目录(以IDEA为例) 打开工具栏的运行配置Edit Configurations 添加物理目录和并设置虚拟目录路径添加img图片在img文件夹内测试访问:http://localhost...
    99+
    2023-05-31
    spring mvc 上传
  • Springboot实现图片上传功能的示例代码
    首先对图片进行UUID 防止图片被覆盖以及爬图 UUID的生成规则:日期时间,MAC地址,HashCode,随机数(多种之一) 开发上传接口,两处红字意思是生成文件夹和生成目标文件,...
    99+
    2024-04-02
  • android文件上传示例分享(android图片上传)
    主要思路是调用系统文件管理器或者其他媒体采集资源来获取要上传的文件,然后将文件的上传进度实时展示到进度条中。 主Activity 代码如下:package com.guoto...
    99+
    2022-06-06
    示例 Android
  • js自己实现一个大文件切片上传+断点续传的示例代码
    目录首先我们来分析一下需求一、 格式校验二、 文件切片三、 断点续传 + 秒传 + 上传进度PM:喂,那个切图仔,我这里有个100G的视频要上传,你帮我做一个上传后台,下班前给我哦,...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作