文件上传到服务器本地

项目需要做一个模板管理,由于模板内容不多,所以并不使用Nginx和FTP和OSS管理,采用最朴素的文件上传到本地服务器中。

Controller层

    /**
     * 上传模板到相对路径
     */
    @Operation(tags = "文件模版表", summary = "上传模板到相对路径")
    @PostMapping("/upload")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "file", value = "文件"),
            @ApiImplicitParam(name = "code", value = "文件code唯一")
    })
    public Result upload(MultipartFile file, String code){
        return templateService.uploadTemplate(file, code);
    }


    /**
     * 获取文件返回
     *
     * @param response
     * @throws IOException
     */
    @GetMapping(value = "file")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "code", value = "文件code")
    })
    public void file(String code, HttpServletResponse response) throws IOException {
        templateService.getFile(code, response);
    }

Service


    /**
     * 上传模板到相对路径
     * @param file
     * @return
     */
    Result uploadTemplate(MultipartFile file,String code);

    /**
     * 获取文件名
     * @param code
     * @param response
     */
    void getFile(String code, HttpServletResponse response) throws IOException;

ServiceImpl

    @Override
    public Result uploadTemplate(MultipartFile file, String code) {
        // 获取项目根目录
        String property = null;
        try {
            property = new File(ResourceUtils.getURL("classpath:").getPath()).getParent();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        // 判断code是否已经存在
        Template template = templateMapper.selectOne(Wrappers.lambdaQuery(Template.class)
                .eq(Template::getDeleted, false)
                .eq(Template::getCode, code));
        if (Objects.nonNull(template)) {
            throw new ApplicationException(500, code + "模板已存在");
        }

        // 获取文件后缀名
        String substring = Objects.requireNonNull(file.getOriginalFilename()).substring(file.getOriginalFilename().lastIndexOf("."));
        try {

            //完成入库操作
            Template build = Template.builder().code(code)
                    .name(file.getOriginalFilename())
                    .extension(substring)
                    .path( this.path + code + substring)
                    .build();
            templateMapper.insert(build);
            savePic(file.getInputStream(), code + substring, property + this.path);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return Result.success();
    }
    @Override
    public void getFile(String code, HttpServletResponse response) throws IOException {
       String  property = new File(ResourceUtils.getURL("classpath:").getPath()).getParent();
        // 通过文件id查询模板文件
        Template template = templateMapper.selectOne(Wrappers.lambdaQuery(Template.class)
                .eq(Template :: getCode,code)
                .eq(Template :: getDeleted ,false));
        if (Objects.isNull(template)) {
            throw new ApplicationException(500, "模板不存在");
        }

        // 读到流中
        InputStream inStream;
        try {
            inStream = new FileInputStream(property + template.getPath());
            // 设置输出的格式
            response.reset();
            response.setContentType("application/octet-stream");
            String filename = URLEncoder.encode(template.getName(), StandardCharsets.UTF_8);
            response.addHeader("Content-Disposition", "attachment; filename=" + filename);
            // 循环取出流中的数据
            byte[] b = new byte[100];
            int len;
            while ((len = inStream.read(b)) > 0) {
                response.getOutputStream().write(b, 0, len);
            }
            inStream.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

    }
    
    /**
     * 保存文件到指定目录
     *
     * @param inputStream 输入流
     * @param code        文件code
     */
    private void savePic(InputStream inputStream, String code, String property) {
        // 获取项目根目录
        OutputStream os = null;
        try {

            // 1K的数据缓冲
            byte[] bs = new byte[1024];
            int len;

            // 输出的文件流保存到本地文件
            File tempFile = new File(property);
            if (!tempFile.exists()) {
                tempFile.mkdirs();
            }

            // 用code保存文件名
            os = new FileOutputStream(tempFile.getPath() + File.separator + code);

            // 开始读取
            while ((len = inputStream.read(bs)) != -1) {
                os.write(bs, 0, len);
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 完毕,关闭所有链接
            try {
                assert os != null;
                os.close();
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现文件上传服务器本地,可以使用Java Servlet来处理上传请求,并使用Apache Commons FileUpload库来解析上传的文件。以下是一个简单的示例代码: ```java import java.io.File; import java.io.IOException; import java.util.List; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; @WebServlet("/upload") public class FileUploadServlet extends HttpServlet { private static final long serialVersionUID = 1L; @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 检查是否为文件上传请求 if (!ServletFileUpload.isMultipartContent(request)) { response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Not a multipart request"); return; } // 创建文件上传对象 DiskFileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); try { // 解析上传的文件 List<FileItem> items = upload.parseRequest(request); // 遍历所有上传的文件 for (FileItem item : items) { // 忽略其他表单字段 if (!item.isFormField()) { // 获取上传文件的名称和类型 String fileName = item.getName(); String contentType = item.getContentType(); // 创建目标文件 File file = new File("/path/to/uploaded/files", fileName); // 将上传的文件保存到本地 item.write(file); // 输出上传成功的信息 response.getWriter().println("File uploaded successfully: " + fileName); // 构造访问文件的URL String fileUrl = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath() + "/uploaded/files/" + fileName; response.getWriter().println("File URL: " + fileUrl); } } } catch (Exception e) { // 处理上传异常 response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Error uploading file: " + e.getMessage()); } } } ``` 在上述代码中,我们首先检查请求是否为文件上传请求,然后创建一个`DiskFileItemFactory`对象和一个`ServletFileUpload`对象来解析上传的文件。在遍历所有上传的文件时,我们只处理文件类型的表单字段,忽略其他类型的字段。对于每个上传的文件,我们创建一个目标文件并将其保存到本地。最后,我们构造一个URL来访问上传的文件,并将其输出到响应中。 需要注意的是,上面示例中的路径"/path/to/uploaded/files"需要根据实际情况修改为你想要保存上传文件的目录。另外,为了能够通过URL访问上传的文件,需要将上传的文件保存到Web应用程序目录下的某个子目录中(在上述示例中为"/uploaded/files")。 如果你使用Maven管理Java项目,可以通过以下方式添加Apache Commons FileUpload库的依赖: ```xml <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.4</version> </dependency> ``` 这样就可以在Java中实现文件上传服务器本地,并通过URL访问了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值