java - Spring Rest Controller 不适用于文件上传

标签 java spring tomcat8 spring-restcontroller filehandler

我尝试过使用 mongodb 的没有任何 View 的 REST API。我的应用程序在 Spring boot 嵌入式服务器上运行良好,没有错误。独立的 tomcat 应用程序运行时没有错误,但无法访问 @RestController 映射的 url。显示404页面未找到。它没有创建该 url,但其他 url 工作正常。

这是配置

FileStorageProperties.java

@Component
public class FileStorageProperties {
    private static String baseDir = "E://temp//FileManager//";
    private String uploadDir = "";

    public String getUploadDir() {
        return baseDir + uploadDir;
    }

    public void setUploadDir(String uploadDir) {
        this.uploadDir = baseDir + uploadDir;
    }
}

MediaTypeUtils.java

public class MediaTypeUtils {

    // abc.zip
    // abc.pdf,..
    public static MediaType getMediaTypeForFileName(ServletContext servletContext, String fileName) {
        // application/pdf
        // application/xml
        // image/gif, ...
        String mineType = servletContext.getMimeType(fileName);
        try {
            MediaType mediaType = MediaType.parseMediaType(mineType);
            return mediaType;
        } catch (Exception e) {
            return MediaType.APPLICATION_OCTET_STREAM;
        }
    }

}

这是模型

Avatar.java:

@Document
@Component
public class Avatar {
    @Id
//  @Indexed(unique = true)
    private String id;
    private String originalName;
    @Indexed(unique = true)
    private String generatedName;
    private String size;
    @DBRef
    private User user;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getOriginalName() {
        return originalName;
    }

    public void setOriginalName(String originalName) {
        this.originalName = originalName;
    }

    public String getGeneratedName() {
        return generatedName;
    }

    public void setGeneratedName(String generatedName) {
        this.generatedName = generatedName;
    }

    public String getSize() {
        return size;
    }

    public void setSize(String size) {
        this.size = size;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    @Override
    public String toString() {
        return "Avatar [id=" + id + ", originalName=" + originalName + ", generatedName=" + generatedName + ", size="
                + size + ", user=" + user + "]";
    }


}

UploadFileResponse.java

public class UploadFileResponse {
    private String fileName;
    private String fileType;
    private long size;

    public String getFileName() {
        return fileName;
    }

    public void setFileName(String fileName) {
        this.fileName = fileName;
    }

    public String getFileType() {
        return fileType;
    }

    public void setFileType(String fileType) {
        this.fileType = fileType;
    }

    public long getSize() {
        return size;
    }

    public void setSize(long size) {
        this.size = size;
    }

    public UploadFileResponse(String fileName, String fileType, long size) {
        this.fileName = fileName;
        this.fileType = fileType;
        this.size = size;
    }
}

FileStorageException.java

public class FileStorageException extends RuntimeException {
    /**
     * 
     */
    private static final long serialVersionUID = -2482390550398268830L;

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

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

MyFileNotFoundException.java

@ResponseStatus(HttpStatus.NOT_FOUND)
public class MyFileNotFoundException extends RuntimeException {
    /**
     * 
     */
    private static final long serialVersionUID = -7680896574598153059L;

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

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

现在存储库:

AvatarRepository.java

public interface AvatarRepository extends MongoRepository<Avatar, String>{

    public Avatar findAvatarByGeneratedName(String generatedName);
    public Avatar findAvatarByUser(User user);

}

AvatarRepositopryImpl.java - 有一些重写的​​ MongoRepository 方法,这些方法在以下代码中被忽略,因为根本没有使用这些方法。

@Repository
public class AvatarRepositopryImpl implements AvatarRepository {
    @Autowired
    MongoTemplate mongoTemplate;

    private static final String COLLECTION_NAME = "avatar";

    @Override
    public <S extends Avatar> List<S> saveAll(Iterable<S> entities) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public List<Avatar> findAll() {
        return mongoTemplate.findAll(Avatar.class, COLLECTION_NAME);
    }

    @Override
    public <S extends Avatar> S save(S entity) {
        return mongoTemplate.save(entity);
    }

    @Override
    public void deleteById(String id) {
        mongoTemplate.remove(id);
    }

    @Override
    public void delete(Avatar entity) {
        mongoTemplate.remove(entity);
    }

    @Override
    public Avatar findAvatarByGeneratedName(String generatedName) {
        Query query = new Query();
        query.addCriteria(Criteria.where("generatedName").is(generatedName));
        return (Avatar) mongoTemplate.findOne(query, Avatar.class);
    }

    @Override
    public Avatar findAvatarByUser(User user) {
//      System.out.println(user);
        Query query = new Query();
        query.addCriteria(Criteria.where("user").is(user));
        return (Avatar) mongoTemplate.find(query, Avatar.class);
    }

}

这是我的服务:

AvatarService.java

@Service
public class AvatarService {

    @Autowired
    private Avatar avatar;
//
//  @Autowired
//  private FileStorageService fileStorageService;

    @Autowired
    AvatarRepository avatarRepository;

    /**
     * @param fileStorageService
     * @param avatarRepository
     */

    public Avatar findAvatarByGeneratedName(String generatedName) {
        return avatarRepository.findAvatarByGeneratedName(generatedName);
    }

    public Avatar findAvatarByUser(User user) {
        System.out.println(user);
        return avatarRepository.findAvatarByUser(user);
    }

    public Avatar saveAvatar(User user,String fileOriginalName, String fileNameToSave, String fileSize) {
        avatar.setId(UUID.randomUUID().toString());
        avatar.setOriginalName(fileOriginalName);
        avatar.setGeneratedName(fileNameToSave);
        avatar.setSize(fileSize);
        avatar.setUser(user);

        return avatarRepository.save(avatar);
    }

    public void deleteAvatarByGeneratedName(String generatedName, Avatar avatar) {
        avatar = findAvatarByGeneratedName(generatedName);
        avatarRepository.deleteById(avatar.getId());
    }

AvatarManager.java

public class AvatarManager {

    AvatarService avatarService;

    @Autowired
    Avatar avatar;

    public AvatarManager(AvatarService avatarService) {
        this.avatarService = avatarService;
    }

    public String saveAvatar(User user, MultipartFile file) {
        deleteAvatarByUser(user);
        String[] ext = file.getOriginalFilename().split(Pattern.quote("."));
        String generatedName = new UUIDGenerator().generateId(avatar).toString() + "." + ext[ext.length - 1];
        avatarService.saveAvatar(user, file.getOriginalFilename(), generatedName, file.getSize() + "");
        new FileStorageService(new FileStorageProperties()).uploadFile(file, generatedName);
        new UploadFileResponse(generatedName, file.getContentType(), file.getSize());
        return generatedName;
    }

    public void deleteAvatar(String generatedName) {
        Avatar avatar = avatarService.findAvatarByGeneratedName(generatedName);
        if (avatar != null) {
            new FileStorageService(new FileStorageProperties()).deleteFile(generatedName);
            avatarService.deleteAvatarByGeneratedName(generatedName, avatar);
        }
    }

    public void deleteAvatarByUser(User user) {
//      System.out.println(user);
        avatar = avatarService.findAvatarByUser(user);
//      System.out.println(avatar.getGeneratedName());
        if (avatar != null) {
            deleteAvatar(avatar.getGeneratedName());
        }
    }

    public ResponseEntity<Resource> downloadAvatar(String avatarGeneratedName, HttpServletRequest request) {
//      System.out.println(request);
        return new FileStorageService(new FileStorageProperties()).downloadFile(avatarGeneratedName, request);
    }
}

现在是 Controller 。我给出了两个映射。第一个与文件管理器无关。它适用于两台服务器。另一种是在 spring boot 嵌入式服务器上工作,但不在独立的 tomcat 上工作。它也没有显示任何错误或创建任何网址。

这是Controller.java

@CrossOrigin(origins = { "*" })
@RestController
public class UserController {

    @Autowired
    EmployeeService employeeService;

    @Autowired
    UserService userService;

    @Autowired
    AvatarService avatarService;

    @Autowired
    BCryptPasswordEncoder passwordEncoder;

//It works on both server


@RequestMapping(value = "/login", method = RequestMethod.POST)
        public String loginEmployee(@RequestParam Map<String, String> data) {
            return new EmployeeManager(employeeService, userService)
                    .validateUserLogin(data.get("0").toString(), data.get("1"), passwordEncoder).toString();
        }

    //It doesn't work with standalone server
        @RequestMapping(value = "/edit-employee-profile", method = RequestMethod.POST)
    public void editProfileEmployee(@RequestParam(value = "avatar", required = false) MultipartFile file,
            @RequestParam(value = "user") String data) {
        JSONParser jp = new JSONParser(data);
        System.out.println(jp);
        LinkedHashMap<String, Object> userInfo;
        try {
            userInfo = jp.parseObject();
            User user = userService.findUserByEmail(userInfo.get("email").toString());
            System.out.println(user);
            user.setAvatarExistance(true);
            userService.updateUser(user);
//      Employee employee = employeeService.findEmployeeByUser(user);
            System.out.println(data);
            new EmployeeManager(employeeService, userService).employeeProfileEdit(data);
            if (file != null) {
                System.out.println(file);
                new AvatarManager(avatarService).saveAvatar(user, file);
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
//      return "";
    }

最佳答案

将文件作为请求正文(而不是作为 URL 参数和 @RequestParam)发布,以免超出 safe maximum URL length :

@RequestMapping(value = "/uploadFile", method = RequestMethod.POST)
@ResponseStatus(value = HttpStatus.OK)
public void uploadFile(ModelMap m, MultipartHttpServletRequest request) {

    MultiValueMap<String, MultipartFile> multiFileMap = request.getMultiFileMap();
    List<MultipartFile> files = multiFileMap.isEmpty() ? null : multiFileMap.values().iterator().next();
    MultipartFile file = files != null && !files.isEmpty() ? files.get(0) : null;

    // ...
}

关于java - Spring Rest Controller 不适用于文件上传,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58976220/

相关文章:

maven - java.lang.NoClassDefFoundError : org. springframework.beans.FatalBeanException 错误

java - 估计给定参数值增加的平均时间

java - log4j 错误邮件挂起线程

java - Google App Engine - 无法在单个事务中对多个实体组进行操作

java - CrudRepository 使用不正确的表/模式来选择实体

java - Postman - 所需的 MultipartFile 参数不存在 - Spring,Java

java - APR 错误 : -730054

java - DWR安全异常: HttpSessionId is blank in POST request

java - 使用类中的方法返回值与引用确切值本身之间的区别

java - 在不同的包中重复使用常量是否可以接受?