spring boot +Vue + element-ui实现图片上传和回显

对于图片上传和显示后台采用SpringBoot实现:

package com.example.demo.controller;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.IdUtil;
import com.example.demo.domain.Books;
import com.example.demo.service.BooksService;
import com.example.demo.util.Result;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Arrays;
import java.util.List;

@RestController
@RequestMapping("/books")
public class BookController {

    @Value("${server.port}")
    private String port;

    String path=System.getProperty("user.dir") +"/book-java/src/main/resources/upload/";
    private static final String host="http://localhost";

    @Resource
    private BooksService booksService;

    @ApiOperation("图书列表")
    @GetMapping("/")
    public Result<List<Books>> findBooks(){
        return  new Result<>(true, 200, "OK", this.booksService.list());
    }

    @ApiOperation("新增图书")
    @PostMapping("/add")
    public Result<?> addBook(@RequestBody Books books){
        return this.booksService.save(books)
                ? new Result<>(true, 200, "新增成功!")
                : new Result<>(false, 202, "新增失败!");
    }

    @ApiOperation("上传图片")
    @PostMapping("/upload")
    public Result<?> upload(MultipartFile file){

        System.out.println(path);
        String id= IdUtil.fastSimpleUUID();
        String originalFilename = file.getOriginalFilename();
        String imgPath= path+id+"_"+originalFilename;
        System.out.println(imgPath);
        try {
            FileUtil.writeBytes(file.getBytes(),imgPath);
        } catch (IOException e) {
            e.printStackTrace();
            return new Result<>(false, 303, "上传失败!");
        }
        return new Result<>(true, 200, "上传成功", host+":"+this.port+"/books/"+id);
    }

    @GetMapping("/{flag}")
    @ApiOperation("文件下载")
    public void downFile(@PathVariable String flag, HttpServletResponse response){
        OutputStream outputStream=null;
        File file=new File(path);
        List<String>  list= Arrays.asList(file.list());
        String fileName=list.stream().filter(name->name.contains(flag)).findAny().orElse("");
        if(fileName!=null && !fileName.isEmpty()){
            try {
                response.addHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(fileName, "utf-8"));
                response.setContentType("application/octet-stream");

                byte[] arr= FileUtil.readBytes(path+fileName);
                outputStream=response.getOutputStream();
                outputStream.write(arr);
                outputStream.flush();
                outputStream.close();
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

这里要特别注意的是:参数名称必须是file,必须是post方式!

public Result<?> upload(MultipartFile file){

前端Vue:

 <el-dialog
                title="添加图书"
                :visible.sync="dialogVisible"
                width="30%"
                :before-close="handleClose">
            <div>
                <el-form :model="book" label-width="120px">
                    <el-form-item label="图书名称">
                        <el-input  v-model="book.title"></el-input>
                    </el-form-item>
                    <el-form-item label="图书作者">
                        <el-input v-model="book.author"></el-input>
                    </el-form-item>
                    <el-form-item label="图书价格">
                        <el-input  v-model="book.price"></el-input>
                    </el-form-item>
                    <el-form-item label="库存数量">
                        <el-input v-model="book.kucun"></el-input>
                    </el-form-item>
                    <el-form-item label="图书封面">
                        <el-upload
                                class="upload-demo"
                                v-model="book.pic"
                                action="http://localhost:8081/books/upload" :on-success="upPic">
                            <el-button size="small" type="primary">点击上传</el-button>
                        </el-upload>
                    </el-form-item>

                </el-form>
            </div>
            <span slot="footer" class="dialog-footer">
    <el-button @click="dialogVisible = false">取 消</el-button>
    <el-button type="primary" @click="addBook">确 定</el-button>
  </span>
 </el-dialog>

图片上传:

  upPic(resp){
                console.log(resp.data);
                //获取图片名称
                this.book.pic=resp.data;
            },

新增:

 addBook(){
                request.post('/books/add',this.book).then(resp=>{
                    if(resp.code===200){
                        this.$message.success('新增图书成功!');
                        this.book={};
                        this.getBooks();
                        this.dialogVisible=false;

                    }else{
                        this.$message.error('新增图书失败!')
                    }
                })
            },

图片的显示:

 <el-table-column
                label="封面"
        >
           <template #default="scope">
               <el-image
                       style="width: 50px; height: 50px"
                       :src="scope.row.pic"
                       :preview-src-list="[scope.row.pic]">
               </el-image>
           </template>
        </el-table-column>

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值