解决servlet中form设为multipart/form-data时request无法获取数据问题

         我们知道,在servlet中, 我们都是使用request对象的getparameter方法来获得数据,但是当我们在进行文件上传的时候,我们需要将form的enctype设置为multipart/form-data,这时候就会出现一个问题,就是是request.getParameter(“name”);方法将没有办法获得到表单里面的文本域里面的内容了。

         其中的一个解决方案就是,使用弹出窗口的方法,在新的窗口里面完成数据的上传,将上传之后的地址返回到父窗口的表单里面,form的类型还是原来的,这样我们使用的时候就避免了上面的问题。

商品图片

         点击按钮的时候的弹出窗口:

var pic=document.getElementById("uploadPic");
pic.onclick=openWin;
function openWin(){
window.open("uploadPic.html","上传图片","width:200px;height:200px;");
}

     弹出的窗口是:







图片上传

action="../../uploadFile.do">

上传文件 1:






 我们使用单独一个servlet来处理图片上传,并且返回上传之后的路径:

package cn.ynu.st.background.servlet;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.Date;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class UploadFile extends HttpServlet {

private static final long serialVersionUID = 2185251939279408726L;

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

this.doPost(request, response);
}

@SuppressWarnings("unchecked")
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

try
{
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");

PrintWriter out = response.getWriter();
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
List items = upload.parseRequest(request);
String uploadPath = this.getServletContext().getRealPath("/")+"upload\\";
String filename = "";
InputStream is = null;

for (FileItem item : items) //
{

if (item.isFormField())
{
if (item.getFieldName().equals("filename"))
{

if (!item.getString().equals(""))
filename = item.getString("UTF-8");

}
}
else if (item.getName() != null && !item.getName().equals("")) //
{

filename = item.getName().substring(
item.getName().lastIndexOf("\\") + 1);
is = item.getInputStream();

}

}
String userfilename=new Date().getTime()+ filename;
filename = uploadPath +new Date().getTime()+ filename;
if (new File(filename).exists())
{
out.println("文件已经存在");
}
else if (!filename.equals(""))
{
FileOutputStream fos = new FileOutputStream(filename);
byte[] buffer = new byte[8192]; //
int count = 0;
while ((count = is.read(buffer)) > 0)
{
fos.write(buffer, 0, count);
}
fos.close();
is.close();
String url="\\upload\\"+userfilename;
out.println("");
out.println("");
out.println("");
out.println("");
out.println("");
out.println("");
out.println("文件上传成功");
out.println("图片上传的路径是"+url);
out.println("");
out.println("");
out.println("");
out.println("");

}
}
catch (Exception e)
{
System.err.println(e.getMessage());
}

}

}
        这样的话,当数据上传完成之后,就可以将返回的路径返回到父窗口里面。

共有 30 条评论

  1. 使用弹出窗口的方法,在新的窗口里面完成数据的上传,将上传之后的地址返回到父窗口的表单里面,form的类型还是原来的,这样我们使用的时候就避免了上面的问题。

Top