通过表单提交数据,完成文件上传代码

来源:互联网 发布:三菱plc编程软件work2 编辑:程序博客网 时间:2024/06/05 02:11

通过表单提交数据,完成文件上传代码

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");}}


阅读全文
2 0
原创粉丝点击