Springboot-上传图片并保存路径到数据库

本文详细介绍了一个基于Spring Data JPA框架的文件上传工具类及控制器实现,包括如何生成唯一文件名、处理文件上传流程,并将图片信息与文章实体进行关联。

图片文章关联实体

@Entity
@Table(name = "article_picture")
public class ArticlePictureEntity extends BaseEntity implements Serializable {

    /**
     * 图片地址
     */
    private String url;

    /**
     * 文章id
     */
    private String contentId;
    //===========忽略getter setter和构造函数==============
}

service和dao忽略

我的项目中是用了springdatajpa框架写dao
就是一个保存实体的save方法

工具类

文件上传工具类

/**
 * @description: 文件上传工具类
 * @author: yuxiang
 * @create: 2019-12-02 15:54
 **/
public class FileUtils {

    /**
     *
     * @param file 文件
     * @param path   文件存放路径
     * @param fileName 原文件名
     * @return
     */
    public static boolean upload(MultipartFile file, String path, String fileName){

        // 生成新的文件名
        String realPath = path + "/" + FileNameUtils.getFileName(fileName);

        //使用原文件名
        // String realPath = path + "/" + fileName;

        File dest = new File(realPath);

        //判断文件父目录是否存在
        if(!dest.getParentFile().exists()){
            dest.getParentFile().mkdir();
        }

        try {
            //保存文件
            file.transferTo(dest);
            return true;
        } catch (IllegalStateException e) {
            e.printStackTrace();
            return false;
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }

    }
}

生成文件名字工具类

/**
 * @description: 生成文件名工具类
 * @author: yuxiang
 * @create: 2019-12-02 15:53
 **/
public class FileNameUtils {

    /**
     * 获取文件后缀
     * @param fileName
     * @return
     */
    public static String getSuffix(String fileName){
        return fileName.substring(fileName.lastIndexOf("."));
    }

    /**
     * 生成新的文件名
     * @param fileOriginName 源文件名
     * @return
     */
    public static String getFileName(String fileOriginName){
        return UUIDUtils.getUUID() + FileNameUtils.getSuffix(fileOriginName);
    }


}
/**
 * @description:
 * @author: yuxiang
 * @create: 2019-12-02 15:54
 **/
public class UUIDUtils {

    public static String getUUID(){
        return UUID.randomUUID().toString().replace("-", "");
    }

}

上传文件controller

首先要在application.yml配置,也就是下面的@Value("${web.upload-path}")来源

# 配置外部访问文件
web:
  upload-path: D:/image/
/**
 * @description: 文件上传
 * @author: yuxiang
 * @create: 2019-12-02 15:40
 **/
@RequestMapping("file")
@Controller
public class FileController {

    private final ResourceLoader resourceLoader;

    @Autowired
    public FileController(ResourceLoader resourceLoader) {
        this.resourceLoader = resourceLoader;
    }

    @Value("${web.upload-path}")
    private String path;

    @Autowired
    private ArticlePictureService articlePictureService;

    /**
     * 上传图片文件
     *
     * @param file
     * @return
     */
    @PostMapping("imgUpload")
    @ResponseBody
    public String imgUpload(@RequestParam("img") MultipartFile file,
                                 @RequestParam("articleId") String id) {
        String response = " ";

        if (file.isEmpty()) {
            return new ApiResponse(-1, "文件为空!");
        }
        try {
            //1.定义上传的文件
            String localPath = path;
            //2.获得文件名字
            String fileName = file.getOriginalFilename();
            //3.上传

            //3.1 生成新的文件名
            String realPath = localPath + "/" + FileNameUtils.getFileName(fileName);
            //3.2 保存文件
            File dest = new File(realPath);
            //判断文件目目录是否存在,不存在则新建
            if (!dest.getParentFile().exists()){
                dest.getParentFile().mkdir();
            }
            file.transferTo(dest);

            //保存路径到数据库
            ArticlePictureEntity entity = new ArticlePictureEntity(id, realPath);
            articlePictureService.save(entity);

            response = "上传成功";

        } catch (Exception e) {
            e.printStackTrace();
            response = "服务器出现错误,上传失败";
        }
        return response;
    }

更新
源码在我的资源库里面可以下载,不需要币

可以使用Apache PDFBox和Spring Boot的MultipartFile类来实现PDF图片上传到服务器保存路径数据库。首先,使用MultipartFile类将PDF文件上传到服务器上的指定目录。然后,使用Apache PDFBox将PDF文件转换为图片图片保存到服务器上的指定目录。最后,将图片路径保存数据库中。以下是示例代码: ``` @PostMapping("/uploadPDF") public String uploadPDF(@RequestParam("file") MultipartFile file) { String fileName = StringUtils.cleanPath(file.getOriginalFilename()); String uploadDir = "pdf_uploads"; String filePath = uploadDir + "/" + fileName; try { FileUploadUtil.saveFile(uploadDir, fileName, file); PDDocument document = PDDocument.load(new File(filePath)); PDFRenderer pdfRenderer = new PDFRenderer(document); BufferedImage bim = pdfRenderer.renderImageWithDPI(0, 300, ImageType.RGB); String imageDir = "image_uploads"; String imageName = FilenameUtils.getBaseName(fileName) + ".png"; String imagePath = imageDir + "/" + imageName; FileUploadUtil.saveImage(imageDir, imageName, bim); document.close(); // 将图片路径保存数据库中 // ... return "File uploaded successfully!"; } catch (IOException e) { e.printStackTrace(); return "Failed to upload file!"; } } ``` 其中,FileUploadUtil是一个工具类,用于保存文件和图片到指定目录: ``` public class FileUploadUtil { public static void saveFile(String uploadDir, String fileName, MultipartFile file) throws IOException { Path uploadPath = Paths.get(uploadDir); if (!Files.exists(uploadPath)) { Files.createDirectories(uploadPath); } try (InputStream inputStream = file.getInputStream()) { Path filePath = uploadPath.resolve(fileName); Files.copy(inputStream, filePath, StandardCopyOption.REPLACE_EXISTING); } catch (IOException e) { throw new IOException("Could not save file: " + fileName, e); } } public static void saveImage(String uploadDir, String imageName, BufferedImage image) throws IOException { Path uploadPath = Paths.get(uploadDir); if (!Files.exists(uploadPath)) { Files.createDirectories(uploadPath); } Path imagePath = uploadPath.resolve(imageName); ImageIO.write(image, "png", imagePath.toFile()); } } ```
评论 49
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值