最近一段时间内经历了几次大的图片上传方法的变动,特意写下这几篇文章,以便学习和总结。
今天说的这个方法是一个很传统的图片上传方法,主要思路是页面表单提交图片文件,然后后台把这个图片文件写入本地,将本地图片路径作为一个字符串存入数据库。
鄙人采用的SSH2框架,为简化文章,框架本身的一些配置文件没有给出,可以通过方法路径的命名得知其含义
页面代码片段
<form method="post" action="http://127.0.0.1/shanxia_serve/u/fileUpload_uploadImgForTest" enctype="multipart/form-data">
<input type="file" name="uploadFile" >
<input type="submit" value="OK" >
页面代码很简单,主要是表单里面有个文件属性定义,enctype=”multipart/form-data”,然后就是标签里面的name=”XX”,因为是表单提交,所以这里需要将其定义为name属性以便后台接受。
后台代码片段
private File uploadFile;//上传文件
private String uploadFileFileName;//文件名
public File getUploadFile() {
return uploadFile;
}
public void setUploadFile(File uploadFile) {
this.uploadFile = uploadFile;
}
public String getUploadFileFileName() {
return uploadFileFileName;
}
public void setUploadFileFileName(String uploadFileFileName) {
this.uploadFileFileName = uploadFileFileName;
}
public String uploadImg() throws IOException{
String uuid = UUID.randomUUID().toString().replace("-", "");//重命名文件的文件体
InputStream is=new FileInputStream(uploadFile);//将<input>标签里面的图片文件写入流文件InpuStream
String uploadPath=ServletActionContext.getServletContext().getRealPath("/photos/");
File toFile=new File(uploadPath,this.getUploadFileFileName());//目标文件,由文件位置和文件名(请求文件的文件名)组成
/**
* 这段代码用于重命名文件,以免文件被覆盖
*/
int pot=toFile.getName().lastIndexOf(".");
String ext="";
if(pot!=-1){
ext=toFile.getName().substring(pot);
}else{
ext="";
}
String newName=uuid+ext;
toFile=new File(toFile.getParent(),newName); //重命名文件完成
/**
* 将客户端的二进制数据流写入到服务器本地
*/
OutputStream os=new FileOutputStream(toFile);
byte[] buffer=new byte[1024];//缓冲空间大小 单位为KB
int length=0;
while((length=is.read(buffer))>0){
os.write(buffer,0, length);
}
is.close();
os.close(); //文件写入本地完成
String webRoot=req.getSession().getServletContext().getRealPath("/");//获取文件在服务器项目文件夹的绝对路径
String basePath="/photos/"+toFile.getName();//文件的相对路径
String url=webRoot+basePath;//文件的完整路径,而接下来我们只需要将这个完整路径存入数据库即可
PrintWriter out=resp.getWriter();
out.print(urL);
out.print("||success");
return null;
}
上述核心代码实现了接受页面传过来的图片文件,然后将其通过输入输出流文件的形式写入到服务器本地,然后获取文件本身的完整路径。