Java:使用唯一名称重命名MultiPartFile并将其存储到文件夹并将URL保存到数据库

贝亚托·阿卜杜拉:

我有一个基于Spring Boot的后端,一个基于Angular 5的前端。通过Angular接收MultiPartFile之后,我想使用唯一的名称(表的ID)重命名此文件并将其存储到文件夹中,然后将该文件的URL放入到数据库PostgreSQL。请帮助我,我测试了很多方法,但均未取得任何好的结果。我试图将MultiPartFile转换为File,但是我不知道该怎么做。请帮我

这是包含处理MultiPartFile的方法的类:

package smart.syndic.metier;

import java.net.MalformedURLException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.io.Resource;
import org.springframework.core.io.UrlResource;
import org.springframework.stereotype.Service;
import org.springframework.util.FileSystemUtils;
import org.springframework.web.multipart.MultipartFile;

@Service
public class StorageService 
{
Logger logger = LoggerFactory.getLogger(this.getClass().getName());
private final Path rootLocation = Paths.get("fichiers/prestataires");

public void store(MultipartFile file) {
    try {

        Files.copy(file.getInputStream(), 
this.rootLocation.resolve(file.getOriginalFilename()), 
StandardCopyOption.REPLACE_EXISTING);
    } catch (Exception e) {
        throw new RuntimeException("FAIL!");
    }
 }

public Resource loadFile(String filename) {
    try {
        Path file = rootLocation.resolve(filename);
        Resource resource = new UrlResource(file.toUri());
        if (resource.exists() || resource.isReadable()) {
            return resource;
        } else {
            throw new RuntimeException("FAIL!");
        }
    } catch (MalformedURLException e) {
        throw new RuntimeException("FAIL!");
    }
 }

public void deleteAll() {
    FileSystemUtils.deleteRecursively(rootLocation.toFile());
 }
}

这是RestController:

package smart.syndic.web;

import java.util.ArrayList;
 import java.util.List;
 import java.util.stream.Collectors;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.Resource;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseEntity;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;


import  org.springframework.web.servlet.mvc.method.annotation.
MvcUriComponentsBuilder;
import smart.syndic.dao.PrestatairesRepository;
import smart.syndic.dao.PrestatairesTypesRepository;
import smart.syndic.entities.Prestataires;
import smart.syndic.metier.StorageService;

@RestController
@CrossOrigin("*")
public class PrestatairesRestController 
{
@Autowired
private PrestatairesRepository repository;

@Autowired
private PrestatairesTypesRepository repository2;

@Autowired
private StorageService storageService;

private List<String> files = new ArrayList<String>();

@RequestMapping(value="/prestataires/{id}", 
        method=RequestMethod.GET)
public Prestataires getVilles(@PathVariable Long id)
{
    return repository.findOne(id);
}

@RequestMapping(value="/prestataires", 
        method=RequestMethod.POST)
public Prestataires addVilles(Prestataires p,
        @RequestParam("multipartFile") MultipartFile file)
{
    try{
        storageService.store(file);
        files.add(file.getOriginalFilename());
        p.setPhoto("fichiers/prestataires/"+file.getOriginalFilename());

    }catch(Exception e){
        e.printStackTrace();
    }


 p.setPrestatairesTypes(repository2.findOne(p.getPrestatairesTypes()
 .getId()));

    return repository.save(p);              
}

}

这是Entity Prestataires:

package smart.syndic.entities;

import java.io.Serializable;
import java.util.Collection;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;

@Entity
public class Prestataires implements Serializable 
{
@Id @GeneratedValue
private Long id;
private String nom;
private String email;
private String tele;
private String fax;
private String rib;
private String adresse;
private String taches;
private String photo;

//-------------------Constructors--------------------
//-------------------Getters and Setters--------------------


@ManyToOne
@JoinColumn(name="ID_PRESTATAIRES_TYPES")
private PrestatairesTypes prestatairesTypes;
}
VK321:

如果仅文件名是问题,那么您的代码就可以了,您所需要做的就是使用一些字符串创建文件名或像下面这样清理它

//Create custom filename 
String filename = StringUtils.cleanPath(file.getOriginalFilename());
//remove spaces and make lowercase    
filename = filename.toLowerCase().replaceAll(" ", "-");

要么

String filename = p.getId()+"."+file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".") + 1);

然后在您的复制方法中

Files.copy(file.getInputStream(), this.rootLocation.resolve(filename),
                StandardCopyOption.REPLACE_EXISTING); 

这是例子

@Service
public class UploadService {

@Value("${app.image.cdn}")
private String imageCDN;

@Value("${app.upload.path}")
private String uploadPath;

private Path rootLocation;


public String store(MultipartFile file) {

    String storedLocation;
    rootLocation = Paths.get(uploadPath);

    String filename = StringUtils.cleanPath(file.getOriginalFilename());
    filename = filename.toLowerCase().replaceAll(" ", "-");

    try {
        if (file.isEmpty()) {
            throw new StorageException("Failed to store empty file " + filename);
        }
        if (filename.contains("..")) {
            // This is a security check
            throw new StorageException(
                    "Cannot store file with relative path outside current directory "
                            + filename);
        }
        Files.copy(file.getInputStream(), this.rootLocation.resolve(filename),
                StandardCopyOption.REPLACE_EXISTING);

        storedLocation = imageCDN+filename;

    }
    catch (IOException e) {
        throw new StorageException("Failed to store file " + filename, e);
    }


    return storedLocation;
}
}

还有你的application.properties

spring.servlet.multipart.max-file-size=20MB
spring.servlet.multipart.max-request-size=20MB

app.upload.path=/uploads
app.image.cdn=http://yourhost.com/uploads/

还有你的StorageException类

public class StorageException extends RuntimeException {

  public StorageException(String message) {
    super(message);
  }

  public StorageException(String message, Throwable cause) {
    super(message, cause);
  }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用文件夹名称重命名文件并将它们移动到一个大文件夹

查找 index.html 文件并使用文件夹名称重命名并将文件向上移动一个级别

将不同的唯一文件上传到服务器,并将其名称保存到数据库

想要将图像保存到文件夹并将URL保存在数据库中

Java重命名一堆文件并将其移动到新文件夹

数据库触发firebase函数以从URL下载图像并将其保存到存储

如何通过名称查找特定的子文件夹并将其重命名?

VB获取子文件夹名称并将其保存到文本文件

如何使用OpenCV Java压缩图像并将其存储到特定文件夹

使用父文件夹的名称重命名子文件夹中的文件

Bash:使用文件夹名称重命名文件(每个文件夹 1 个)

使用文件夹名称重命名文件夹中的所有图像

如何避免java.lang.StackOverflowError:堆栈大小8MB,将图像保存到Firebase存储,并将其下载uri到Firebase数据库

扫描一个充满视频的文件夹,获取每个视频的文件名和文件路径并将其添加到电影数据库

将文件从子文件夹复制到父文件夹并使用父文件夹名称重命名文件

如何在对象中存储数据并将其保存到SQLite数据库中?

phonegap从URL下载图像并将其保存到应用程序安装文件夹

如何上传文件并将其以原始名称保存在存储文件夹中

使用Android中的kotlin下载文件并将其保存到下载文件夹

根据文件夹名称重命名文件

根据文件夹名称重命名文件

通过文件夹名称重命名文件

PHP和Ajax将文件路径上传到Mysql并将重命名的图像保存到文件夹失败

重命名文件并将重命名的文件复制到主文件夹中的 subbolder

如何根据文件夹名称重命名文件名?

如何从MySQL数据库检索数据并将其保存到xml文件

Fileupload到服务器并将其ID作为guid保存到数据库

文本区域字段中的多个URL链接并将其保存到数据库中

如何使用 NiFi 处理器获取 csv 文件行内容并将其保存到数据库中?