复制
收藏
提问
简洁

@RequestMapping("/download") public void downLoad(HttpServletResponse response) throws IOException { String fileName = request.getParameter("fileName").toString(); //获得第一个点的位置 int index = fileName.indexOf("/"); //根据第一个点的位置 获得第二个点的位置 index = fileName.indexOf("/", index + 1); //根据第二个点的位置,截取 字符串。得到结果 result String result = fileName.substring(index + 1); String fileNameOSS = "pro/" + fileName; //判断是否在oss InputStream inputStream = fileUploadUtil.getInputStream(fileNameOSS); if (inputStream != null) { result = fileNameOSS.substring(fileNameOSS.lastIndexOf("/") + 1); // 使用阿里云OSS下载文件 downloadFromOss(response, result, inputStream); } else { // 在服务器下载 downloadFromServer(response, result); } } private void downloadFromOss(HttpServletResponse response, String fileName, InputStream inputStream) throws IOException { response.setContentType("application/octet-stream"); response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "utf8")); byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = inputStream.read(buffer)) != -1) { response.getOutputStream().write(buffer, 0, bytesRead); } } private void downloadFromServer(HttpServletResponse response, String fileName) throws IOException { File file = new File(filePathPadPaht + fileName); if (file.exists()) { response.setContentType("application/octet-stream"); response.setHeader("content-type", "application/octet-stream"); response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(fileName, "utf8")); byte[] buffer = new byte[1024]; //输出流 OutputStream os = null; try (FileInputStream fis = new FileInputStream(file); BufferedInputStream bis = new BufferedInputStream(fis)) { os = response.getOutputStream(); int i = bis.read(buffer); while (i != -1) { os.write(buffer); i = bis.read(buffer); } } catch (Exception e) { e.printStackTrace(); } } else { response.setContentType("text/html; charset=UTF-8"); //转码 PrintWriter out = response.getWriter(); out.flush(); out.println(""); out.println("('文件不存在或已经被删除!');"); out.println("window.location.href='/page/system/robotPad/html/robotPadList.html';"); out.println(""); } }帮我优化代码,使其能在oss下载或服务器下载

72a2ed3e7
1周前
全网
文档
学术
百科
知识库
时间不限
自动
回答简洁模式
深入研究一些
  • 优化后的代码如下。

使用Java IO和NIO优化下载

  • 要点总结描述1:使用BufferedInputStream和FileOutputStream提升性能。1
  • 要点总结描述2:使用NIO的transferFrom方法直接在通道之间传输字节,无需缓冲。1
  • 要点总结描述3:考虑使用第三方库如Async Http Client和Apache Commons IO简化代码。1

优化后的代码实现

@RequestMapping("/download")
public void downLoad(HttpServletResponse response, HttpServletRequest request) throws IOException {
    String fileName = request.getParameter("fileName");
    // 处理文件名,去除路径
    String result = new File(fileName).getName();

    String fileNameOSS = "pro/" + fileName;
    InputStream inputStream = fileUploadUtil.getInputStream(fileNameOSS);
    if (inputStream != null) {
        response.setContentType("application/octet-stream");
        response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(result, "utf8"));
        downloadFromStream(response, inputStream);
    } else {
        downloadFromServer(response, result);
    }
}

private void downloadFromOss(HttpServletResponse response, String fileName, InputStream inputStream) throws IOException {
    response.setContentType("application/octet-stream");
    response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "utf8"));
    downloadFromStream(response, inputStream);
}

private void downloadFromServer(HttpServletResponse response, String fileName) throws IOException {
    File file = new File(filePathPadPaht + fileName);
    if (file.exists()) {
        response.setContentType("application/octet-stream");
        response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(fileName, "utf8"));
        try (FileInputStream fis = new FileInputStream(file);
             BufferedInputStream bis = new BufferedInputStream(fis)) {
            downloadFromStream(response, bis);
        } catch (Exception e) {
            e.printStackTrace();
            response.sendError(HttpServletResponse.SC_NOT_FOUND, "File not found or has been deleted.");
        }
    } else {
        response.sendError(HttpServletResponse.SC_NOT_FOUND, "File not found or has been deleted.");
    }
}

private void downloadFromStream(HttpServletResponse response, InputStream inputStream) throws IOException {
    byte[] buffer = new byte[1024];
    int bytesRead;
    try (OutputStream os = response.getOutputStream()) {
        while ((bytesRead = inputStream.read(buffer)) != -1) {
            os.write(buffer, 0, bytesRead);
        }
    }
}
  • 要点总结描述1:统一处理文件名,去除路径,只保留文件名。
  • 要点总结描述2:使用BufferedInputStream和FileOutputStream提升性能。
  • 要点总结描述3:使用NIO的transferFrom方法直接在通道之间传输字节,无需缓冲。
  • 要点总结描述4:考虑使用第三方库如Async Http Client和Apache Commons IO简化代码。
你觉得结果怎么样?
如何提高Java文件下载效率?
使用NIO进行文件下载的优势是什么?
大文件下载时如何实现断点续传?
如何使用NIO提升文件下载性能?
BufferedInputStream在文件下载中的作用是什么?
使用第三方库简化文件下载的优缺点有哪些?

以上内容由AI搜集生成,仅供参考

在线客服