java 批量下载附件_java上传附件,批量下载附件(一)

本文展示了如何使用Java实现批量下载和单个下载附件。通过Apache Commons FileUpload库处理上传,然后利用Ant的ZipOutputStream和ZipEntry进行文件压缩,实现批量下载。代码示例包括上传、单个下载和批量压缩下载附件的方法。
摘要由CSDN通过智能技术生成

上传附件代码:借助commons-fileupload-1.2.jar

package com.str;

import java.io.BufferedInputStream;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.util.Iterator;

import java.util.List;

import javax.servlet.ServletException;

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.FileUploadException;

import org.apache.commons.fileupload.disk.DiskFileItemFactory;

import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class UploadServlet extends HttpServlet {

@Override

protected void doPost(HttpServletRequest req, HttpServletResponse resp)

throws ServletException, IOException {

doGet(req, resp);

}

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp)

throws ServletException, IOException {

HttpServletRequest request = (HttpServletRequest)req;

HttpServletResponse response = (HttpServletResponse)resp;

/* response.setContentType("text/html;charset=gb2312");

response.setCharacterEncoding("utf-8");*/

OutputStream outputStream = null;

InputStream inputStream = null;

DiskFileItemFactory factory = new DiskFileItemFactory();

ServletFileUpload fileUpload = new ServletFileUpload(factory);

try {

List items = fileUpload.parseRequest(request);

for (Iterator iterator = items.iterator(); iterator.hasNext();) {

FileItem name = (FileItem) iterator.next();

if(!name.isFormField()){

String fieldName  = name.getFieldName();  //这个是name值

String fileName = name.getName();     //这个是全路径

String lastFileName ="";

//这句话获取的是源文件的原名称,不做任何修改

String oldNamePath = fileName.substring(fileName.lastIndexOf("\\")+1);

if(fileName.endsWith(".docx")|| fileName.endsWith(".xls")){

lastFileName = request.getRealPath("/")+"\\upload\\"+ oldNamePath;

outputStream = new FileOutputStream(new File(lastFileName ));

inputStream = name.getInputStream();

byte[] bs = new byte[1024];

int length = 0;

while(null != inputStream && (length = inputStream.read(bs))!=-1){

outputStream.write(bs);

}

}

outputStream.flush();

}

//把lastFileName存到数据库(这里就不写了不只lz用的什么方式)}

}

} catch (Exception e) {

e.printStackTrace();

}

}

}

单个下载文件,批量下载文件代码:借助于ant.jar包的ZipOutputStream、ZipEntry

package com.str;

import java.io.File;

import java.io.FileInputStream;

import java.io.IOException;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.apache.tools.zip.ZipEntry;

import org.apache.tools.zip.ZipOutputStream;

public class LoadServlet  extends HttpServlet {

@Override

/*protected void doGet(HttpServletRequest req, HttpServletResponse resp)

throws ServletException, IOException {

String path = getServletContext().getRealPath("/") + "\\upload";

OutputStream o = resp.getOutputStream();

byte b[] = new byte[1024];

//这个地方的文件,可以从数据库中动态查找,我这边写死了为了简单展示

File fileLoad = new File(path, "解析类型配置.xls");

String filename = new String("解析类型配置.xls".getBytes("gbk"), "iso8859-1");

System.out.println(filename);

我记得在Excel导出数据的时候说过filename千万别写中文,其实经过以下:

String filename = new String("解析类型配置.xls".getBytes("gbk"), "iso8859-1");

转换以后,文件无论是中文、英文,都不会出现乱码情况,本人已验证

resp.setHeader("Content-disposition", "attachment;filename="+ filename);

long fileLength = fileLoad.length();

String length = String.valueOf(fileLength);

resp.setHeader("Content_Length", length);

FileInputStream in = new FileInputStream(fileLoad);

int n = 0;

while ((n = in.read(b)) != -1) {

o.write(b, 0, n);

}

}*/

//以上是单个下载附件,这边是批量压缩下载附件

protected void doGet(HttpServletRequest req, HttpServletResponse resp)

throws ServletException, IOException {

String zipFileName = "test.zip";

//这些文件都是存在的,我是写死了的,可以从页面传名称过来

String[] filePathArray = {"1.jpg","2.jpg","3.xls","测试.docx"};

String path = getServletContext().getRealPath("/") + "\\image";

resp.setContentType("application/x-msdownload" ); // 通知客户文件的MIME类型:

resp.setHeader("Content-disposition","attachment;filename=" + zipFileName);

ZipOutputStream zos = new ZipOutputStream(resp.getOutputStream());

for (String filePath : filePathArray) {

File file = new File(path + File.separator + filePath);

doZip(file, zos);

}

zos.close();

}

//处理批量下载时候,文件压缩问题

private void doZip(File file, ZipOutputStream zos) throws IOException {

if(file.exists()) {

if (file.isFile()) {

//如果是文件,写入到 zip 流中

String fileName = file.getName();

ZipEntry zet = new ZipEntry(file.getName());

zos.putNextEntry(zet);

FileInputStream fis = new FileInputStream(file);

byte[] buffer = new byte[1024];

int r = 0;

while ((r = fis.read(buffer)) != -1) {

zos.write(buffer, 0, r);

}

zos.setEncoding("gbk");   //这个地方很重要

zos.flush();

fis.close();

}else {

System.out.println("不是文件,那就不下载了,因为前台会做处理,此处就不在一步步进行验证了!");

}

}

}

}

实现Java批量上传附件并附带源码,可以使用Java的文件上传功能和网络编程。 首先,需要创建一个前端页面,通过HTML的<input type="file" multiple> 实现批量文件选择,并给该input元素添加一个id,以便在Java程序中获取到文件信息。 接下来,在Java端,可以使用Servlet或Spring MVC来处理文件上传请求。可以通过HttpServletRequest的getPart("inputId")方法来获取批量上传的文件信息。 在Servlet中,可以使用FileOutputStream和InputStream等Java IO类,来完成文件的读取和写入操作。可以通过循环的方式,依次处理每个上传的文件。首先,创建一个用于存储上传文件的文件夹,然后通过getPart方法获取到上传的文件流,再根据文件流的内容,创建一个输出流将文件保存到指定的位置。 下面是一个简单的示例代码: ```java @WebServlet("/upload") public class UploadServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { final String SAVE_DIR = "uploadFiles"; String appPath = request.getServletContext().getRealPath(""); String savePath = appPath + File.separator + SAVE_DIR; File fileSaveDir = new File(savePath); if (!fileSaveDir.exists()) { fileSaveDir.mkdir(); } Collection<Part> parts = request.getParts(); for (Part part : parts) { String fileName = extractFileName(part); if (fileName != null && !fileName.equals("")) { part.write(savePath + File.separator + fileName); } } response.setContentType("text/plain"); response.setCharacterEncoding("UTF-8"); response.getWriter().write("文件上传成功!"); } private String extractFileName(Part part) { String contentDisp = part.getHeader("content-disposition"); String[] items = contentDisp.split(";"); for (String item : items) { if (item.trim().startsWith("filename")) { return item.substring(item.indexOf("=") + 2, item.length()-1); } } return null; } } ``` 以上代码是一个用Servlet实现的简单文件上传的示例,只包含了基本的文件上传功能,可以根据具体需要进行修改和扩展。 希望以上回答对您有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值