SView Help Center
English (US)

实际文件上传

Author: sviewngts Last Updated: 2026-08-25 16:31
package com.hoteam.sview.demo;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.ContentType;
import cn.hutool.http.Header;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpStatus;
import cn.hutool.http.Method;
import lombok.extern.slf4j.Slf4j;

import java.io.File;

/**
 * 文件上传调用 Demo
 * <p>
 * 采用 PUT 方式上传文件原始二进制流
 * 推荐直接使用 {@link GetUploadUrlDemo} 返回的 uploadUrl 进行上传
 * 上传链接有效期由后端接口统一控制
 */
@Slf4j
public class UploadDemo {

    /**
     * 使用接口返回的上传地址上传文件
     *
     * @param uploadUrl 由 {@link GetUploadUrlDemo} 获取的上传地址
     * @param file      待上传本地文件
     * @return 上传成功返回 true,失败返回 false
     */
    public static boolean uploadByUploadUrl(String uploadUrl, File file) {
        if (StrUtil.isBlank(uploadUrl)) {
            log.warn("uploadUrl 不能为空");
            return false;
        }
        if (file == null || !file.exists() || !file.isFile()) {
            log.warn("待上传文件不存在或不是文件: [{}]", file);
            return false;
        }

        return uploadByUploadUrl(uploadUrl, FileUtil.readBytes(file));
    }

    /**
     * 使用接口返回的上传地址上传文件(二进制流版本)
     *
     * @param uploadUrl 由 {@link GetUploadUrlDemo} 获取的上传地址
     * @param fileBytes 文件二进制数据
     * @return 上传成功返回 true,失败返回 false
     */
    public static boolean uploadByUploadUrl(String uploadUrl, byte[] fileBytes) {
        if (StrUtil.isBlank(uploadUrl)) {
            log.warn("uploadUrl 不能为空");
            return false;
        }
        if (fileBytes == null || fileBytes.length == 0) {
            log.warn("文件二进制流不能为空");
            return false;
        }

        HttpRequest request = HttpRequest.of(uploadUrl)
                .method(Method.PUT)
                .header(Header.CONTENT_TYPE, ContentType.OCTET_STREAM.getValue())
                .body(fileBytes)
                .timeout(60_000);

        try (HttpResponse response = request.execute()) {
            int status = response.getStatus();
            String respBody = response.body();
            log.info("文件上传响应: status=[{}], body=[{}]", status, respBody);

            // 统一使用 HTTP 200 状态码判定上传成功
            if (status == HttpStatus.HTTP_OK) {
                log.info("文件上传成功: size=[{}], uploadUrl=[{}]", fileBytes.length, uploadUrl);
                return true;
            }

            log.warn("文件上传失败: status=[{}]", status);
            return false;
        } catch (Exception e) {
            log.error("文件上传接口异常", e);
            return false;
        }
    }

    /**
     * 调用入口示例
     */
    public static void main(String[] args) {
        // 待上传文件
        File file = new File("D:/test/test.prt");

        // 获取上传地址
        GetUploadUrlDemo.UploadUrlResult urlResult = GetUploadUrlDemo
                .getUploadUrl(file.getName(), GetUploadUrlDemo.Category.ENT_MY_SPACE);
        if (urlResult == null) {
            log.warn("获取上传链接失败,终止上传流程");
            return;
        }

        // 文件方式上传
        boolean ok = uploadByUploadUrl(urlResult.getUploadUrl(), file);
        log.info("文件上传是否成功: {}", ok);

        // 二进制方式上传示例
        // byte[] bytes = FileUtil.readBytes(file);
        // boolean okBytes = uploadByUploadUrl(urlResult.getUploadUrl(), bytes);
        // log.info("二进制上传是否成功: {}", okBytes);
    }
}