Java后端上传文件和下载文件端口

本文介绍了使用JavaSpringMVC框架,配合MultipartFile和Swagger,实现RESTfulAPI接口上传图片和下载文件的过程,同时讨论了文件存储路径管理和服务器迁移问题。
摘要由CSDN通过智能技术生成
<!--上传文件-->
    <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.3.1</version>
    </dependency>
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.4</version>
 </dependency>





import com.yzdx.AiInterviewer.comment.R;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.util.*;



@RestController
@Slf4j
public class UploadController {


    //设置上传文件的最大大小
    public static final int MAX_SIZE = 10 * 1024 * 1024;
    //设置文件的类型
    public static final List<String> AVATAR_TYPE = new ArrayList<>();
    static {
        AVATAR_TYPE.add("image/png");
        AVATAR_TYPE.add("image/gif");
        AVATAR_TYPE.add("image/bmp");
        AVATAR_TYPE.add("image/jpg");
        AVATAR_TYPE.add("image/jpeg");
    }
    
    private static final String BASE_URL = "上传文件的服务器地址";//例如 http://localhost:8080
    /**
     * 上传图片
     *
     * @param request
     */
    @ApiImplicitParams({
            @ApiImplicitParam(name = "file", required = true),
    })
    @PostMapping("/upload_picture")
    @ApiOperation(value = "上传图片", notes = "")

    public R upLoadPicture(HttpServletRequest request, @RequestParam("file") MultipartFile file) {


//MultipartFile是spring提供的类,可以接收所有的文件的类

        log.info(file.getContentType());

        if (file.isEmpty()) {
            return R.error("请选择文件");
        }

        if (file.getSize() > MAX_SIZE) {//file.getSize()获取接收文件的大小
            return R.error("文件大小超出最大限制");
        }
        if (!AVATAR_TYPE.contains(file.getContentType())) {//自定义接收文件的类型
            return R.error("文件类型不匹配");
        }

        String uploadPath = request.getSession().getServletContext().getRealPath("/upload/picture/");//获取上传文件的路径(获取项目中名为‘upload’的文件夹)

        log.info(uploadPath);
        
        File dir = new File(uploadPath);

        if (!dir.exists()) {
            dir.mkdirs();//若不存在,则创建该文件夹
        }

        String originalFilename = file.getOriginalFilename();//获取文件的真实文件名

        int index = originalFilename.lastIndexOf(".");//获取文件的后缀名‘.’的位置

        String substring = originalFilename.substring(index);//返回文件类型名 例如:.jpg

        String filename = UUID.randomUUID().toString().toUpperCase() + substring;//新创建的文件名

        File dest = new File(dir, filename);//创建一个空的文件

        try {

            file.transferTo(dest);

        } catch (IOException e) {

            System.out.println(e.getMessage());
            return R.error("文件存储出现异常");

        }
        String RealFilePath = BASE_URL + "/upload/picture/" + filename;
        Map<String, Object> data = new HashMap<>();
        data.put("image", RealFilePath);
        data.put("filename", filename);
        return R.success(data);//返回图片存储在服务器的地址
    }
}

        以上代码是java上传文件的代码,其中包含swagger接口的引用,每个人可以根据自己的需求来进行引用,还有R文件是自己定义的返回类,为了在文件上传的过程中出现错误,可以在application里面进行添加一段来对上传的文件进行约束

spring:
 servlet:
    multipart:
      max-file-size: 50MB  #单个文件大小限制
      max-request-size: 50MB #总文件大小限制(允许存储文件的文件夹大小)

        下面是java后端实现文件下载的参考代码

 @GetMapping("/download_file")
    @ApiOperation(value = "下载文件", notes = "")

    public R downLoadFile(HttpServletRequest request, String downloadFilename, HttpServletResponse response) {
        String filePath = request.getSession().getServletContext().getRealPath("/upload/files/");
        String filePathName = filePath + File.separator + downloadFilename;
        BufferedInputStream bins = null;
        BufferedOutputStream bouts = null;
        try {
            //同一个窗口下载多次,清除空白流
            response.reset();
            File file = new File(filePathName);
            if (!file.exists()) {
                log.error("要下载的文件不存在:{}", filePathName);
                return R.error("要下载的文件不存在:"+filePathName );
            }
            bins = new BufferedInputStream(new FileInputStream(filePathName));
            bouts = new BufferedOutputStream(response.getOutputStream());
            String userAgent = request.getHeader("USER-AGENT").toLowerCase();
            // 如果是火狐浏览器
            if (userAgent.contains("firefox")) {
                downloadFilename = new String(downloadFilename.getBytes(), "ISO8859-1");
            } else {
                downloadFilename = URLEncoder.encode(downloadFilename, "UTF-8");
            }
            //设置发送到客户端的响应的内容类型
            response.setContentType("application/download");
            //指定客户端下载的文件的名称
            response.setHeader("Content-disposition", "attachment;filename=" + downloadFilename);
            int len;
            byte[] bytes = new byte[1024];
            while ((len = bins.read(bytes)) != -1) {
                bouts.write(bytes, 0, len);
            }
            //刷新流
            bouts.flush();
            log.info("下载完成");

        } catch (IOException e) {
            log.error("下载文件异常:{}", e.getMessage());
            e.printStackTrace();
            return R.error(e.getMessage());
        } finally {
            try {
                if (bouts != null) {
                    bouts.close();
                }
                if (bins != null) {
                    bins.close();
                }
            } catch (IOException e) {
                log.error("关闭流异常", e);
                e.printStackTrace();
                return R.error("关闭流异常");
            }
        }
        return R.success("下载完成");

    }

        以上代码是根据指定文件目录(/upload/files/)根据文件名称(downloadFilename)进行文件查找,将目录中找到的文件进行操作下载,其中/upload/files/是我自己创建的文件夹,java项目根据request.getSession().getServletContext().getRealPath("/upload/files/") 这个方法寻找项目中的upload/files/文件夹目录。

        注:如何创建上传文件的文件目录,在java项目的根目录下如果没有static这个文件夹,那么程序就会将上传的文件存放在零时目录中,我用的是windows系统,我的存储在C盘里面是某个位置,这里我就懒得翻了,有兴趣的可以自行百度一下,如果在java项目的根目录下创建一个static文件夹那么上传的文件就会上传到static文件夹中,如下图

        我的文件目录如上图,在java项目的根目录上创建一个文件夹,我这个项目需要上传很多文件类型的文件,基本上跟第一部分上传文件的方法差不多,可以自行修改。这样我们在网页上传的文件就能保存到自己创建的文件夹里面了。例如request.getSession().getServletContext().getRealPath("/upload/picture/");//获取上传文件的路径(获取项目中名为‘upload’的文件夹)获取的就是static文件夹/upload/picture/ 的位置。

        那么这是在开发环境下进行上传文件,那么打包好的jar文件运行在服务器上找到这个static文件夹呢?我们在打包项目成jar文件时,是没有将static文件夹进行打包处理的,所以我们要在上传jar和部署java时,jar文件所在的位置创建一个static文件夹进行存储上传的文件,例如下图:

        如上就是java文件进行文件上传和下载的一些分享,有些不足希望大佬们指导指导!还有文件上传到服务器时我的程序将服务器的ip地址+文件的绝对路径 存储在数据库中,所以在更换服务器的时候在数据库中拿出的数据还是原来的服务器的ip地址+文件的绝对路径 希望大佬们能提供一些建议!

  • 9
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
要实现从前端上下载PDF文件到FTP服务器,可以使用Java编程语言和FTP客户端库。 首先,需要在前端创建一个文件表单,并设置相应的文件选择按钮、提交按钮和处理逻辑。用户选择要上的PDF文件后,将文件发送给后端服务器。 接下来,后端使用Java编写一个处理上文件的控制器。控制器接收到文件后,使用FTP客户端库连接到FTP服务器。可以使用Apache Commons Net库中提供的FTPClient类。通过FTPClient,可以使用connect()方法连接到FTP服务器,使用login()方法提供用户名和密码进行登录验证,使用setFileType()方法设置文件类型为二进制,并使用storeFile()方法将文件存储到FTP服务器指定的路径。 要实现从FTP服务器下载PDF文件,可以在前端创建一个下载按钮,用户点击按钮后,发起对控制器的请求。后端代码中,使用FTPClient连接到FTP服务器后,使用retrieveFile()方法从服务器下载指定的PDF文件到本地。 在实现上下载的过程中,需要注意异常处理和文件路径的设置。确保FTP服务器的地址、端口、用户名和密码正确,并确保FTP服务器的路径正确。 在整个过程中,还需要考虑文件的命名策略和权限管理。可以在上文件时为文件生成唯一的文件名,避免文件冲突。此外,还可以设置FTP服务器的权限,确保上文件只能被授权的用户访问和下载。 通过以上步骤,就可以使用Java实现从前端上下载PDF文件到FTP服务器了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ᯤ⁶ᴳ⁺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值