通过表单提交数据,完成文件上传代码
form表单提交时,大部分情况提交的都是普通文本,但是有的情况下,提交的是二进制文件:如头像、视频、音频、文件等,这中情况下就涉及到了文件上传。
(1)、前端文件上传怎么进行?
<form method="post" enctype="multipart/form-data" action="">
<input type="file" name="xxx"/>
<input type="submit"/>
</form>
form的提交方式必须声明为post方式,因为get方式的大小限制,但是文件一般都很大;form的表单属性enctype必须声明为multipart/form-data类型,因为这种方式提交的不仅是文件的名字还有文件的二进制数据。
(2)、服务器怎么处理上传的文件
因为提交的数据类型发生改变,所以传统的getParameter()方法不可用,可以使用原始的api InputStream in=request.getInputStream();接收到数据,然后根据格式进行解析,取出有效数据,但是算法太过于复杂,所以我们一般采用现成的第三方实现。
导入jar包
commons-fileupload-1.2.1.jar
commons-io-1.4.jar
UploadUtils工具类:
import java.util.Random;
import java.util.UUID;
public class UploadUtils {
/**
* 获取文件真实名称
* 由于浏览器的不同获取的名称可能为:c:/upload/1.jpg或者1.jpg
* 最终获取的为 1.jpg
* @param name 上传上来的文件名称
* @return 真实名称
*/
public static String getRealName(String name){
//获取最后一个"/"
int index = name.lastIndexOf("\\");
return name.substring(index+1);
}
/**
* 获取随机名称
* @param realName 真实名称
* @return uuid 随机名称
*/
public static String getUUIDName(String realName){
//realname 可能是 1.jpg 也可能是 1
//获取后缀名
int index = realName.lastIndexOf(".");
if(index==-1){
return UUID.randomUUID().toString().replace("-", "").toUpperCase();
}else{
return UUID.randomUUID().toString().replace("-", "").toUpperCase()+realName.substring(index);
}
}
/**
* 获取文件目录,可以获取256个随机目录
* @return 随机目录
*/
public static String getDir(){
String s="0123456789ABCDEF";
Random r = new Random();
return "/"+s.charAt(r.nextInt(16))+"/"+s.charAt(r.nextInt(16));
}
public static void main(String[] args) {
//String s="G:\\day17-基础加强\\resource\\1.jpg";
String s="1.jgp";
String realName = getRealName(s);
System.out.println(realName);
String uuidName = getUUIDName(realName);
System.out.println(uuidName);
String dir = getDir();
System.out.println(dir);
}
}
添加商品的方法
//添加商品信息
public void save(HttpServletRequest request, HttpServletResponse response) throws FileUploadException, IOException{
Map map=new HashMap();
Product pro=new Product();
DiskFileItemFactory factory=new DiskFileItemFactory();//创建一个工厂类
ServletFileUpload fileipload=new ServletFileUpload(factory);//创建一个解析对象
List<FileItem> fis = fileipload.parseRequest(request);//解析是将上传的每一部分封装为一个FileItem类
for (FileItem fi : fis) {
if(fi.isFormField()){
String name = fi.getFieldName();
String value = new String(fi.getString().getBytes("iso-8859-1"),"utf-8");//乱码处理
map.put(name, value);
}else{
//获取图片的键与对应的图片名
String name = fi.getFieldName();
String value = fi.getName();
//获取到存储到项目中存放图片目录的真实的路径
String realPath = request.getServletContext().getRealPath("/products");
//目录优化(为了加载更快,把图片放在不同的文件夹中)
String dir = UploadUtils.getDir();
//存放文件的目录
File imgdir=new File(realPath+dir);
if(!imgdir.exists()){
imgdir.mkdirs();
}
//文件名
String filename=UploadUtils.getUUIDName(value);
File file=new File(imgdir, filename);
if(!file.exists()){
file.createNewFile();
}
//开始读与写文件
InputStream in = fi.getInputStream();
FileOutputStream out=new FileOutputStream(file);
IOUtils.copy(in, out);
IOUtils.closeQuietly(in);
IOUtils.closeQuietly(out);
//将文件名存入map中
String imName="products"+dir+"/"+filename;
map.put(name, imName);
}
}
MyBeanUtils.getObject(pro, map);
pro.setPid(UUIDUtils.getUUID());
Category cat=new Category();
String cid =(String) map.get("cid");
cat.setCid(cid);
pro.setCat(cat);
pro.setPdate(new Date());
try {
ps.save(pro);//保存商品的方法,此处省略,就是把pro中的数据存入数据库
response.getWriter().write("yes");
} catch (SQLException e) {
e.printStackTrace();
response.getWriter().write("no");
}
}