文件上传
1.form标签 method= post请求
2.form标签encType属性值必须为multipart/form-data值
3.form标签中使用input type=file添加上传的文件
4.编写服务器代码接收,处理上传的数据
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
服务器端
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提供了大量能使我们快速便捷地处理数据的函数和方法。