javaweb文件上传和下载

文件上传

1.form标签 method= post请求

2.form标签encType属性值必须为multipart/form-data值

3.form标签中使用input type=file添加上传的文件

4.编写服务器代码接收,处理上传的数据


HTTP协议的内容

提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档


服务器端

commos-fileupload.jar 和 commons-io.jar 包中,我们常用的类有哪些?


ServletFileUpload类, 用于解析上传数据
FileItem类 表示每一个表单项。
1. boolean ServletFileUpload.isMultipartContent(HttpServletRequest request); 判断上传的数据格式是否是多段的格式
2. public List<FileItem> paseRequest(HttpServletRequest request);解析上传的数据
3. boolean FileItem.isFormField();判断当前这个表单项,是否是普通的表单项。还是上传的文件类型。true表示普通类型的表单项 , false表示上传的文件类型
4. String FileItem.getFieldName();获取表单项的name属性值。
5. String FileItem.getString();获取表单项的值。
6. String FileItem.getName();获取上传的文件名。
7. void FileItem.write(file);将上传的文件写到参数file所指向的硬盘位置。


fileupload类库的使用

// 1 先判断上传的数据是否多段数据(只有是多段的数据,才是文件上传的)
if(ServletFileUpload.isMultipartContent(req)){
      // 创建FileItemFactory工厂实现类
      FileItemFactory fileItemFactory = new DiskFileItemFactory();
      // 创建用于解析上传数据的工具类ServletFileUpload类
      ServletFileUpload servletFileUpload = new ServletFileUpload(fileItemFactory);
      try{
      // 解析上传的数据,得到每一个表单项FileItem
         List<FileItem> list = servletFileUpload.parseRequest(req);
         // 循环判断 每一个表单项 是普通类型 还是上传的文件
         for(FileItem fileItem : list){
             if(fileItem.isFormField()){
             // 普通表单项
             System.out.println("表单项的name属性值:" + fileItem.getFieldName());
             // 参数 UTF-8 解决乱码问题
             System.out.println("表单项的value属性值:" + fileItem.getString("UTF-8"));
             } else {
              // 上传的文件
              System.out.println("表单项的name属性值:" + fileItem.getFieldName());
             System.out.println("上传的文件名" + fileItem.getName());

             fileItem.write(new File("e:\\" + fileItem.getName());
         }
      } catch (Exception e) {
         e.printStackTrace();
      }
}

文件下载

下载

下载步骤

// 1. 获取要下载的文件名
String downloadFileName= "2.jpg";
// 2.读取要下载的内容(通过ServletContext对象可以读取)
ServletContext servletContext = getServletContext();
// 获取要下载的文件类型
String mimeType = servletContext.getMimeType("/file/" + downloadFileName);
System.out.println("下载的文件类型:" + mimeType);
// 4.在回传前, 通过响应头告诉客户端返回的数据类型
 resp.setContentType(mimeType);
// 5. 告诉客户端收到的数据适用于下载使用 (还是使用响应头)
// Content-Disposition 响应头 表示收到的数据怎么处理
// attachment表示附件 表示下载使用
// filename 表示指定下载的文件名
// filename 如果是中文 需要URL编码 URLEncoder.encode("", "UTF-8");
// 附件中文名乱码问题解决方案:
// 方案一 : URLEncoder 解决IE和谷歌浏览器 附件中文名问题
// String str = "attachment; fileName=" + URLEncoder.encode("中国.jpg", "UTF-8");
// 方案二 : BASE64编码 解决 火狐浏览器附件中文名问题
//      String content = "这是需要Base64编码的内容";
//      创建一个base64编码器
//      BASE64Encoder base64Encoder = new BASE64Encoder();
//      执行编码操作
//      String encodedString = base64Encoder.encode(content.getBytes("UTF-8"));
//       System.out.println(encodedString );
//       创建一个base64解码器
//      BASE64Decoder base64Decoder = new BASE64Decoder();
//      执行编码操作
//      byte[] bytes = base64Decoder.decodeBuffer(encodedString );
//       content = new String(bytes, "UTF-8");
这个时候需要请求头 Content-Disposition:attachment; filename= 中文名
编码成为: Content-Disposition: attachment; filename==?charset?B?xxxx?=
=?charset?B?xxxx?= 
=?  表示编码内容的开始
charset 表示字符集
B  表示BASE64编码
xxxx 表示文件名 BASE64编码后的内容
?=   表示编码内容的结束

 if(req.getHeader("User-Agent").contains("Firefox")){
   // 如果是火狐浏览器 使用base64编码
    resp.setHeader("Content-Disposition", "attachment;filename==?UTF-8?B?" + new BASE64Encoder().encode("中国.jpg".getBytes("UTF-8")) + "?=");
 } else{
   // 如果不是火狐  是IE或者谷歌 用URL编码
    resp.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("中国.jpg", "UTF-8"));
}

// /斜杠被服务器解析表示地址为http://ip:port/工程名/ 映射 到代码的web目录
InputStream resourceAsStream = servletContext.getResourceAsStream("/file/" + downloadFileName);  
// 获取响应的输出流
OutputStream outputStream = resp.getOutputStream();
// 3.把下载的文件内容回传给客户端
// 读取输入流中全部的数据 复制给输出流 输出给客户端
IOUtils.copy(resourceAsStream , outputStream );

2.读入数据

代码如下(示例):

data = pd.read_csv(
    'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())

该处使用的url网络请求的数据。


总结

提示:这里对文章进行总结:

例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值