Java+vue3+element-plus+ts上传图片到服务器并返回图片可访问链接

前端(element-plus):

<div>
          <el-upload
v-model:file-list="fileList" list-type="picture-card" :on-preview="handlePictureCardPreview"
             :auto-upload=false //关闭自动上传
             :limit=6>//最多上传6张。更多API请到Element Plus上查看
            <Icon icon="ep:plus" />
          </el-upload>
          <el-dialog v-model="dialogVisible">
            <img w-full :src="dialogImageUrl" alt="Preview Image" />
          </el-dialog>
</div>

前端(vue):

//TS接口所在文件夹位置
import { SqsVehicleVerificationApi} from '@/api/control/***'
//导入element-plus组件
import { FormInstance, FormRules, UploadProps, UploadUserFile } from 'element-plus';
const fileList = ref<UploadUserFile[]>([])
const dialogImageUrl = ref('')
const dialogVisible = ref(false)

// const handleRemove: UploadProps['onRemove'] = (uploadFile, uploadFiles) => {
//   console.log(uploadFile, uploadFiles)
// }

const handlePictureCardPreview: UploadProps['onPreview'] = (uploadFile) => {
  dialogImageUrl.value = uploadFile.url!
  dialogVisible.value = true
}

//这是我的表单提交的方式,配合后台的
const submitForm = () => {
  //关键:定义提交表单数据类型
        const formData = new FormData();
        //关键:循环该数组,把该图片的file类型放到表单里
        fileList.value.forEach((ele) => {
          if (ele.status === 'ready') {
            formData.append('files', ele.raw as any)
          }
        })
        //弹窗表单里输入的数据,根据自己的来
        const editparams = reactive({
          id: '1',//id
          name: 'aa'
        })
        //JSON.stringify(editparams)是将对象转换为字符串,也叫序列化
        formData.append('Model',JSON.stringify(editparams))//表单数据添加
//该方法是访问后台的方法你也可直接在此使用ajax或者axios访问后台提交formData 表单
//注意:因是FormData类型,post方法记得将头的数据类型改为multipart/form-data
        EditModel(formData);
}


/** 访问后台的方法 */
const EditModel = async (prams: FormData) => {
  try {
    const data = await SqsVehicleVerificationApi.EditApplication(prams)

  } finally {

  }
}

以上两部分是直接在element-plus官网拷贝的,根据自己需求改下即可。

ts访问后端部分:

//将SqsVehicleVerificationApi 暴露出来给vue使用
export const SqsVehicleVerificationApi = {
//我这里是大佬封装好的axios。自行百度axiospost请求即可,或者使用ajax也行,此处不是关键
//数据提交类型记得设置为multipart/form-data
EditApplication : async (formData: FormData) => {
    return await request.post({ url: `/control/sqs-loadingandshipping-manage/EditVerificationApplication`,data:formData,headersType:'multipart/form-data'})
  }, 
}

后台(JAVA MVC)

    //这是控制器方法
//@ModelAttribute("files")取出前台定义的files变量
//@ModelAttribute("Model") 取出前台定义的Model变量
//HttpServletRequest request用来获取服务端路径信息,里面也包含了前台传过来的数据
PostMapping("/EditVerificationApplication")
    @Operation(summary = "編輯申请")
    public CommonResult<Boolean>EditApplicationDatas(@ModelAttribute("files") List<MultipartFile> files,
                                                     @ModelAttribute("Model") String model,HttpServletRequest request) {
        Integer ServerPort = request.getServerPort(); // 服务端端口
        String Address =request.getScheme() + "://"+request.getServerName()+":"+ServerPort+"/api/file/";
        //JSONObject jsonObject=JSONObject.parseObject(model);
        //反序列化映射字段及数据,SqsCreateVehicleApplicationVO 改为自己的类,字段不比数量相等,不过得包含前台数据字段名称与类型
        SqsCreateVehicleApplicationVO data= JSONObject.parseObject(model, SqsCreateVehicleApplicationVO.class);
        String Imagepath="";
        if(files.stream().count()>0){
           for (MultipartFile file : files) {
               try {
//UploadAndDownloadUtil是保存文件的方法
                   String path=Address+UploadAndDownloadUtil.SaveSingleFile(file);
                   Imagepath+="#"+path+"#";
               } catch (Exception e) {
                   throw new RuntimeException(e);
               }
           }
       }
        //给图片路径赋值
        data.setVerificationImage(Imagepath);
//这是具体存入数据库的逻辑,此处不贴了
        sqsManageService.EditApplicationDatas(data);
        return success(true);
    }

import org.apache.commons.io.FilenameUtils;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletContext;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.util.UUID;

/**
 * 文件上传和下载工具类
 */
@Component
public class UploadAndDownloadUtil {
    private static  String PathBase="E:\\Images";

    public static String SaveSingleFile(MultipartFile file) throws Exception{
        String uploadAbsPath = PathBase;
        //判断upload目录是否存在,如果存在就不需要创建
        File uploadDir = new File(uploadAbsPath);
        if (!uploadDir.exists()){
            //upload目录不存在
            uploadDir.mkdirs(); //创建目录,递归创建 例如:a/b/c
        }
        //==========================upload目录是存在=========================
        //文件上传
        //getOriginalFilename():获取原本文件的名称
        // FilenameUtils.getExtension:获取原始文件的后缀,
        String extension = FilenameUtils.getExtension(file.getOriginalFilename());
        //生成上传的文件名称 (随机生成: UUID.randomUUID().toString().replaceAll("-","")+".jpg";)
        String fineName =  UUID.randomUUID().toString().replaceAll("-","")+"."+extension;
        //定义上传文件的绝对路径
        //separator:表示分割符 系统默认给分割符(/),(比如每个电脑的操作系统不一样分隔符就不一样可以让电脑自己决定)
        String uploadFileAbsPath = uploadAbsPath+File.separator+fineName;
        //创建空文件
        File dest = new File(uploadFileAbsPath);
        //执行上传文件
        file.transferTo(dest);
        return  fineName;
    }



    /**
     *上传单个文件
     * @param file
     * @param request
     * @return 上传文件的路径
     * @throws Exception
     */
    public static String uploadSingleFile(MultipartFile file,HttpServletRequest request) throws Exception{
        //获取项目部署的绝对路径
        ServletContext application =  request.getSession().getServletContext();

        //F:\我的资料\web\后端\java\wook\spring-mvc-project\target\spring-mvc-project
        //获取upload目录的绝对路径
        String uploadAbsPath = application.getRealPath(PathBase);
//        String uploadAbsPath = "F:\\我的资料\\web\\后端\\java\\wook\\最新项目\\cellPhone-java\\target"+ConstantUtil.UPLOAD_FILE_DIR;
        //判断upload目录是否存在,如果存在就不需要创建
        File uploadDir = new File(uploadAbsPath);
        if (!uploadDir.exists()){
            //upload目录不存在
            uploadDir.mkdirs(); //创建目录,递归创建 例如:a/b/c
        }
        //==========================upload目录是存在=========================
        //文件上传
        //getOriginalFilename():获取原本文件的名称
        // FilenameUtils.getExtension:获取原始文件的后缀,
        String extension = FilenameUtils.getExtension(file.getOriginalFilename());
        //生成上传的文件名称 (随机生成: UUID.randomUUID().toString().replaceAll("-","")+".jpg";)
        String fineName =  UUID.randomUUID().toString().replaceAll("-","")+"."+extension;
        //定义上传文件的绝对路径
        //separator:表示分割符 系统默认给分割符(/),(比如每个电脑的操作系统不一样分隔符就不一样可以让电脑自己决定)
        String uploadFileAbsPath = uploadAbsPath+File.separator+fineName;
        //创建空文件
        File dest = new File(uploadFileAbsPath);
        //执行上传文件
        file.transferTo(dest);
        return PathBase + File.separator + fineName;
    }

    public ServletOutputStream downloadSingleFile (String filePathName, HttpServletResponse response) throws Exception {
        //通过输入流读取文件的内容
        FileInputStream fileInputStream = new FileInputStream(PathBase + filePathName);
        //通过输出流将文件返回给浏览器展示
        ServletOutputStream outputStream = response.getOutputStream();
        //设置文件类型
        response.setContentType("image/jpeg");
        int len = 0;
        byte[] bytes = new byte[1024];
        while ((len = fileInputStream.read(bytes)) != -1){
            outputStream.write(bytes, 0, len);
            outputStream.flush();//清空缓存
        }
        //关闭资源
        outputStream.close();
        fileInputStream.close();
        return outputStream;
    }
}

重点:映射本地磁盘路径(这样返回的路径才可被前端直接调用显示图片):

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class ImagePathConfigurer implements WebMvcConfigurer {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {

        //配置资源映射:设置虚拟路径,访问绝对路径下资源:访问 http://localhost:8080/api/file/xxx.jpg访问E:/Images/下的资源
        //若访问设有拦截,请在拦截器处设置httpSecurity.antMatchers("/api/file/**").permitAll()//使访问本地图片资源不会被拦截
        //本项目的拦截位置在ProductionWebSecurityConfigurerAdapter类处
        registry.addResourceHandler("/api/file/**") //虚拟路径
                .addResourceLocations("file:///" + "E:/Images/"); //绝对路径以/结尾
    }

}

END.......................................

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Vite是一个用于快速构建现代化的Web项目的构建工具,它专注于开发阶段的快速热重载,并使用ES模块作为原生的开发模式。Vue3是Vue.js的最新版本,它在性能、开发体验和可维护性上都有所提升。 针对你提到的具体的库和框架: - Vue Router是Vue.js官方的路由管理器,用于实现页面之间的导航和路由控制。你可以通过npm安装vue-router,并在项目中进行配置和使用。 - Pinia是Vue.js的状态管理库,它提供了一种简单而强大的方式来管理应用程序的状态。你可以集成Pinia到你的Vue项目中,以便更好地组织和共享你的应用程序状态。 - Axios是一个基于Promise的HTTP客户端,用于通过网络发送异步请求。你可以使用Axios来处理与服务器的通信,并获取数据来更新你的Vue应用程序。 - Element Plus是一套基于Vue3的组件库,包含了丰富的UI组件,可以帮助你快速搭建漂亮的用户界面。你可以在项目中安装和使用Element Plus来实现各种交互效果和用户界面。 如果你想使用Vite、Vue3和以上提到的库和框架来创建一个项目,你可以按照以下步骤进行: 1. 安装Vite:通过npm全局安装Vite,然后使用Vite命令初始化一个新的项目。 2. 配置Vite:根据你的项目需求,在Vite的配置文件中添加Vue Router、Pinia、Axios和Element Plus的相关配置。 3. 安装和配置Vue Router:通过npm安装Vue Router,并在项目中配置和使用Vue Router来管理应用程序的路由。 4. 集成Pinia:通过npm安装Pinia,并在项目中引入和配置Pinia,以便在应用程序中使用Pinia来管理状态。 5. 使用Axios:通过npm安装Axios,并在项目中引入和配置Axios,以便进行网络请求和数据获取。 6. 引入Element Plus:通过npm安装Element Plus,并在项目中按需引入和使用Element Plus的组件,以搭建漂亮的用户界面。 希望以上信息对你有帮助,祝你在使用Vite、Vue3和这些库和框架时取得成功!<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [vite-vue-ts精简模版集成pinia+svg+router+@src](https://download.csdn.net/download/ldy889/85018930)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [vite+vue3+ts+vue-router+pinia+axios+element-plus](https://blog.csdn.net/zy_080400/article/details/127125359)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值