egg实现文件上传 Multipart 【file 模式】(六)

1. 框架内置了 Multipart 插件:

解析浏览器上传的 multipart/form-data 的数据。提供 file 和 stream 两种处理接口供开发者选择。

2. File 模式实现 ,配置:

// config/config.default.js
config.multipart = {
  mode: 'file',
};

3. 前端可以通过 Form 或 AJAX 等方式来上传文件。譬如:

<form method="POST" action="/upload?_csrf={{ ctx.csrf | safe }}" enctype="multipart/form-data">
  title: <input name="title" />
  file1: <input name="file1" type="file" />
  file2: <input name="file2" type="file" />
  <button type="submit">Upload</button>
</form>

注意事项:文件上传需要通过 POST 协议,因此会受到 CSRF 安全的管控,具体参见对应文档。

4. 前后端分离上传:

     let formData = new FormData()
      formData.append('file', file)

      axios({
        method: 'post',
        url: 'http://127.0.0.1:7001/fileupload',
        data: formData
      }).then(res => {
        console.log(res)
      })

5. 获取上传的文件

框架在 File 模式下,会把获取到的文件挂载到 ctx.request.files 数组上。

ctx.request.files: 获取到的文件列表。

6. 其他配置

当重写了 whitelist 时,fileExtensions 不生效。

config.multipart = {
  // 表单 Field 文件名长度限制
  fieldNameSize: 100,
  // 表单 Field 内容大小
  fieldSize: '100kb',
  // 表单 Field 最大个数
  fields: 10,

  // 单个文件大小
  fileSize: '10mb',
  // 允许上传的最大文件数
  files: 10,
  multipart: {
    fileExtensions: [ '.apk' ] // 增加对 apk 扩展名的文件支持
  },
  // 覆盖整个白名单,只允许上传 '.png' 格式
  whitelist: [ '.png' ],
  // 也支持函数格式
  // whitelist: (filename) => [ '.png' ].includes(path.extname(filename) || ''),
};
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java中实现文件的常用方式是使用HTTP协议的`multipart/form-data`格式,具体实现步骤如下: 1. 创建一个`HttpURLConnection`连接对象,设置请求方法为POST,并设置连接超时时间和读取超时时间。 2. 设置请求头信息,包括`Content-Type`、`User-Agent`、`Accept-Language`等,其中`Content-Type`设置为`multipart/form-data`。 3. 创建输出流,并将需要上文件写入到输出流中。在写入文件之前需要设置一个分隔符,用于分隔不同字段的内容。 4. 在输出流的末尾写入分隔符,表示文件结束。 5. 发送HTTP请求,并读取服务器返回的响应结果。 下面是一个Java实现文件的示例代码: ```java public static void uploadFile(String url, File file) throws IOException { String boundary = "---------------------------" + System.currentTimeMillis(); //设置分隔符 HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection(); //创建连接对象 conn.setRequestMethod("POST"); //设置请求方法为POST conn.setConnectTimeout(5000); //设置连接超时时间 conn.setReadTimeout(30000); //设置读取超时时间 conn.setDoOutput(true); //允许输出 conn.setDoInput(true); //允许输入 conn.setUseCaches(false); //不使用缓存 conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary); //设置请求头信息 conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"); conn.setRequestProperty("Accept-Language", "zh-CN,zh;q=0.8"); OutputStream out = new DataOutputStream(conn.getOutputStream()); //创建输出流 FileInputStream fileInputStream = new FileInputStream(file); //创建文件输入流 byte[] buffer = new byte[1024]; int len = 0; out.write(("--" + boundary + "\r\n").getBytes()); //写入分隔符 out.write(("Content-Disposition: form-data; name=\"file\"; filename=\"" + file.getName() + "\"\r\n").getBytes()); out.write(("Content-Type: application/octet-stream\r\n\r\n").getBytes()); while ((len = fileInputStream.read(buffer)) != -1) { out.write(buffer, 0, len); //写入文件数据 } out.write(("\r\n--" + boundary + "--\r\n").getBytes()); //写入分隔符 out.flush(); //清空缓存 fileInputStream.close(); //关闭文件输入流 out.close(); //关闭输出流 int responseCode = conn.getResponseCode(); //获取响应码 if (responseCode == 200) { InputStream inputStream = conn.getInputStream(); //获取响应输入流 BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); //创建读取响应结果的缓冲流 String line; while ((line = bufferedReader.readLine()) != null) { System.out.println(line); //输出响应结果 } bufferedReader.close(); //关闭缓冲流 inputStream.close(); //关闭输入流 } else { System.out.println("文件失败,响应码为:" + responseCode); } } ``` 其中,`url`为上文件的URL,`file`为需要上文件。在实际使用时,需要根据实际情况更改请求头信息、分隔符和文件字段名等参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值