文件传输——本地上传、OSS上传

文章介绍了如何在前端使用El-upload组件处理文件上传,包括设置action属性、钩子事件以及后端Java代码示例,展示了从本地上传至服务器和阿里云OSS的详细过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前端通过upload组件接收数据

action属性,必填项,填写后端接收此文件数据的接口路径
可以额外添加钩子事件::on-success:on-remove

            <el-upload 
              class="upload-demo" 
              action="http://localhost:8080/wedu/sys/goods/ImportExcel"
              enctype="multipart/form-data" 
              :headers="tokenInfo">
              <el-button size="small" type="primary">点击上传</el-button>
              <div slot="tip">只能上传xlsx文件</div>
            </el-upload>

图片上传,需要设置块来放置复现的图片

<el-upload
               class="avatar-uploader"
              :action= "uploadUrl"
               :headers= "tokenInfo"
               :show-file-list="false"
               :on-success="handleAvatarSuccess"
               :before-upload="beforeAvatarUpload">
               <img v-if="imageUrl" :src="imageUrl" class="avatar">
               <i v-else class="el-icon-plus avatar-uploader-icon"></i>

             </el-upload>

本地上传

public R  ImportExcel(@RequestParam("file") MultipartFile file){
        //文件判空
        if (file.isEmpty()) {
            return R.error("文件为空");
        }
        //文件名=当前时间到毫秒+原来的文件名
        String fileName = System.currentTimeMillis() + file.getOriginalFilename();
        //文件路径,歌曲存储路径
        String filePath = System.getProperty("user.dir") + System.getProperty("file.separator") + "***";
        //如果文件路径不存在,新增该路径
        File file1 = new File(filePath);
        if (!file1.exists()) {
            //创建由此抽象路径名命名的目录。
            file1.mkdir();
        }
        //实际的文件地址
        File dest = new File(filePath + System.getProperty("file.separator") + fileName);
        //可以使用try-catch将此方法包裹
        file.transferTo(dest);
 }

System.getProperty("user.dir"):项目的根目录
System.getProperty("file.separator"):“/”,路径分隔符
transferTo():用于将MultipartFile对象中的文件内容写入到指定的文件或目录中,其中包含了关闭文件流的方法

云端上传

阿里云OSS网站

  • 首先引入依赖
		<dependency>
			<groupId>com.aliyun.oss</groupId>
			<artifactId>aliyun-sdk-oss</artifactId>
			<version>3.15.1</version>
		</dependency>

如果原框架中有引入,但版本不同,也可以向上通过properties标签中的<aliyun.oss.version>3.15.1</aliyun.oss.version>进行版本修改

  • 设置OSS工具类
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

//创建bean对象
@Component
public class AliOSSUtils {
    // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
    private String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
    // 从环境变量中获取访问凭证。设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
    private String accessKeyId = "个人密钥";
    private String accessKeySecret = "个人密钥";
    // 填写Bucket名称,例如examplebucket。
    private String bucketName = "个人bucket桶";


    /**
     * 实现文件云端上传
     * @param file
     */
    public String upload(MultipartFile file) throws IOException {
        InputStream inputStream = file.getInputStream();
        //起文件名字:当前时间+文件名字
        String fileName = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd-HH-mm-ss"))+file.getOriginalFilename();

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId,accessKeySecret);
        ossClient.putObject(bucketName,fileName,inputStream);

        //文件访问路径
        String url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + fileName;
        ossClient.shutdown();
        return url;
    }
}

  • 前端访问的接口方法
    //不要忘记装配工具类
	@Autowired
	private AliOSSUtils aliOSSUtils;
	@PostMapping("photoUpload")
	public R photoFile(@RequestParam("file") MultipartFile file){
		try {
		    //直接调用工具类中方法
			String url = aliOSSUtils.upload(file);
			R r = new R();
			r.put("url",url);
			return r;
		} catch (IOException e) {
			return R.error(e.getMessage());

		}
	}
### Spring Boot 实现 OSS 文件上传 #### 1. 添加依赖项 为了在Spring Boot项目中实现OSS文件上传功能,首先需要引入必要的Maven或Gradle依赖。对于阿里云OSS来说,可以在`pom.xml`文件中加入如下依赖: ```xml <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-oss</artifactId> <version>3.10.0</version> </dependency> ``` 此部分确保了应用程序能够访问并调用阿里云提供的SDK接口来完成文件的操作。 #### 2. 配置参数设置 接着,在项目的application.yml或application.properties配置文件内指定连接到特定区域下的Bucket所需的信息,包括但不限于Endpoint、Access Key ID 和 Secret等认证凭证[^3]。 ```yaml aliyun: oss: endpoint: https://oss-cn-beijing.aliyuncs.com accessKeyId: LTAI5tGxXXXXXXXXXX accessKeySecret: XXXXXXXX9vHn8mLqkQxxxxxxxxxxxxxx bucketName: test-bucket-name ``` 以上配置指定了目标存储空间的位置和服务地址,同时提供了身份验证所需的密钥信息以便后续操作时使用。 #### 3. 创建Service层逻辑处理类 定义一个名为`FileUploadService.java`的服务类用于封装具体业务流程,比如初始化客户端实例、执行上传动作以及关闭资源释放等功能模块。以下是该类的一个简单实现方式: ```java import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; public class FileUploadService { private final String endpoint; private final String accessKeyId; private final String accessKeySecret; private final String bucketName; public FileUploadService(String endpoint, String accessKeyId, String accessKeySecret, String bucketName) { this.endpoint = endpoint; this.accessKeyId = accessKeyId; this.accessKeySecret = accessKeySecret; this.bucketName = bucketName; } /** * 将本地路径指向的文件上传至指定bucket下,并返回其URL链接 */ public String uploadFileToOss(MultipartFile file) throws IOException { try (OSS client = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret)) { InputStream inputStream = file.getInputStream(); ObjectMetadata metadata = new ObjectMetadata(); metadata.setContentType(file.getContentType()); PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, file.getName(), inputStream); putObjectRequest.setMetadata(metadata); client.putObject(putObjectRequest); // 执行上传命令 return "https://" + bucketName + "." + endpoint.replace("http://", "") + "/" + file.getName(); // 返回外网可访问url } } } ``` 这段代码展示了如何通过Java API与阿里云OSS交互,实现了基本的文件上传过程。注意这里假设传入的是一个多部件形式的数据流(`MultipartFile`),这通常是从HTTP请求体中获取而来。 #### 4. 控制器方法编写 最后一步是在控制器(Controller)层面暴露RESTful风格API给前端调用者,允许他们提交待上传的内容。下面是一个简单的例子展示怎样接收POST请求并将接收到的文件传递给之前创建好的service来进行实际传输工作: ```java @RestController @RequestMapping("/api/files") public class FileController { @Autowired private FileUploadService fileUploadService; @PostMapping(value="/upload", consumes="multipart/form-data") public ResponseEntity<String> handleFileUpload(@RequestParam("file") MultipartFile file){ if (!file.isEmpty()) { try { String url = fileUploadService.uploadFileToOss(file); return ResponseEntity.ok(url); } catch (IOException e) { log.error(e.getMessage(),e); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null); } }else{ return ResponseEntity.badRequest().body("Please select a valid file."); } } } ``` 上述片段说明了一个典型的Web MVC模式下的处理器函数设计思路——它负责解析来自用户的输入数据并通过适当的方式响应对方;如果一切顺利,则会给出新生成的对象位置作为反馈;反之则报告错误详情。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值