大文件上传与下载

开发环境

后端:springCloud

前端:dva+react

问题

1、大文件上传失败

springCloud可以设置文件上传的大小(不同的版本设置参数可能不同)

如下:

  1. spring.http.multipart.enabled=true

  2. spring.http.multipart.max-file-size=20MB

  3. spring.http.multipart.max-request-size=1000MB

实际中上传的文件可能会很大,前台文件上传设置也不会根据后台设置进行控制,有可能需要上传1G多的文件

这时如果上传1G多的文件,则会受后端限制,从而上传失败

所以需要对文件进行适当的分片

普通文件上传

前端代码:

function uploadFile(data,url){
    let obj = {
        method:'post',
        url:url,
        data:data,
        headers:{
            'Content-Type':'multipart/form-data',
        }
    }
    retrun Axios.create().request(obj).then(res => {
        return res;
    }).catch(err => {
        console.log(err);
        return ''
    })
}

后端代码:

public static void upload(InputStream input,String url){
        OutputStream os = null;
        try{
            os = new FileOutputStream(url);
            byte[] b = new byte[1024];
            int length = 0;
            while ((length = input.read(b)) > 0){
                os.write(b,0,length);
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            try{
                os.close();
            }catch (IOException e){
                e.printStackTrace();
            }
            try{
                input.close();
            }catch (IOException e){
                e.printStackTrace();
            }
        }
    }

大文件上传

参考:https://blog.csdn.net/u014150463/article/details/74044467(包括断点续传,秒传,本人只是用了大文件分片上传,以下代码做了部分修改)

前端代码

使用的是WebUploader组件(https://fex.baidu.com/webuploader/doc/index.html)

import React from 'react';
import { connect } from 'dva';
import { Button,message,Modal} from 'antd';
import WebUploader from 'webuploader'
import styles from './webuploader.less'
import $ from 'jquery'
// 实例化

class ModalContent extends React.Component {


  componentDidMount(){
    debugger
    var $btn = $('#ctlBtn');
    var chunkSize = 5 * 1024 * 1024;
    var uploader = WebUploader.create({
      pick: {
        id: '#picker',
        label:'请选择文件',
        title:''
      },
      formData: {
        uid: 0,
        md5: '',
        chunkSize: chunkSize
      },
      chunked: true,
      chunkSize: chunkSize, // 字节 5M分块
      threads: 1,
      server: 'http://localhost:9090/index/fileUpload',
      auto: false,
      // 禁掉全局的拖拽功能。这样不会出现图片拖进页面的时候,把图片打开。
      disableGlobalDnd: true,
      fileNumLimit: 1024,//验证文件总数量, 超出则不允许加入队列
      fileSizeLimit: 1024 * 1024 * 1024,    // 验证文件总大小是否超出限制, 超出则不允许加入队列
      fileSingleSizeLimit: 1024 * 1024 * 1024    // 验证单个文件大小是否超出限制, 超出则不允许加入队列
    });

//当某个文件的分块在发送前触发,主要用来询问是否要添加附带参数,大文件在开起分片上传的前提下此事件可能会触发多次。
    uploader.onUploadBeforeSend = function (obj, data) {
      var file = obj.file;
      data.uid = file.uid;
    };
    uploader.on('uploadError', function (file) {
      $('#' + file.id).find('p.state').text('上传出错');
    });
// 文件上传
    $btn.on('click', function () {
      uploader.upload();
    });
  }
  render() {
    return (
      <div  className="wu-example">
        <div id="thelist" className="uploader-list"></div>
        <div className="btns">
          <div id="picker"/>
          {/*<Button id='ctlBtn' className="btn btn-default">开始上传</Button>*/}
        </div>
      </div>
    );
  }
}
//将需要的state的项注入到与此视图数据相关的组件props上
function mapStateToProps({ example }) {
  return { example }
}
export default connect(mapStateToProps)(ModalContent);
[class ^= webuploader-container] {
	position: relative;
}
[class ^= webuploader-element-invisible] {
	position: absolute !important;
	clip: rect(1px 1px 1px 1px); /* IE6,
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 中可以使用 HTTPURLConnection 和 InputStream/OutputStream 实现大文件下载,具体步骤如下: 1. 打开连接:使用 URL 类构建下载地址,调用 openConnection 方法打开连接。 2. 设置请求头信息:设置请求头 Range,告诉服务器下载的起始点和结束点。 3. 获取输入流:使用 getInputStream 方法获取输入流。 4. 创建输出流:使用 FileOutputStream 类创建输出流。 5. 缓冲区读写:使用 byte 数组作为缓冲区,循环读写数据。 6. 关闭连接和流:使用 close 方法关闭连接和流。 参考代码如下: ```java URL url = new URL("文件下载地址"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); // 设置请求头 Range,告诉服务器下载的起始点和结束点 conn.setRequestProperty("Range", "bytes=" + startPos + "-" + endPos); InputStream inputStream = conn.getInputStream(); // 创建输出流 FileOutputStream outputStream = new FileOutputStream("文件保存路径"); byte[] buffer = new byte[1024]; int len; // 循环读写数据,使用缓冲区 while ((len = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, len); } // 关闭连接和流 inputStream.close(); outputStream.close(); ``` 对于超大文件上传下载,可以考虑使用分片上传和下载的方式,将文件分成若干个小块进行传输,提高传输效率和稳定性。同时,可以采用断点续传的方式,在网络中断或其他异常情况下,能够从上次中断的地方继续上传或下载

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值