multipart/form-data问题
当我的表单包含multipart/form-data时,我无法从servlet中的文件和文本输入中获取值。我正在使用apache.commons.fileuploads获取上传帮助。有什么建议么。在下面的代码中,还有一些我觉得应该更高效的东西。有没有更好的方法来将这些多个文件存储在数据库中。multipart/form-data问题
public void performTask(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response)
{
boolean promo = false;
Database db = new Database();
Homepage hp = db.getHomePageContents();
String part = ParamUtils.getStringParameter(request, "part", "");
if(part.equals("verbage"))
{
String txtcontent = (String)request.getParameter("txtcontent");
String promoheader = (String)request.getParameter("promoheader");
String promosubheader = (String)request.getParameter("promosubheader");
hp.setBodyText(txtcontent);
hp.setPromoHeader(promoheader);
hp.setPromoSubHeader(promosubheader);
System.err.println(txtcontent);
}
else
{
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if (!isMultipart)
{
}
else {
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
List items = null;
try {
items = upload.parseRequest(request);
//System.err.print(items);
} catch (FileUploadException e) {
e.printStackTrace();
}
Iterator itr = items.iterator();
while (itr.hasNext()) {
FileItem item = (FileItem) itr.next();
if(item.getFieldName().equals("mainimg1"))
{
if(item.getName() !="") hp.setMainImg1(item.getName());
}
if(item.getFieldName().equals("mainimg2"))
{
if(item.getName() !="") hp.setMainImg2(item.getName());
}
if(item.getFieldName().equals("mainimg3"))
{
if(item.getName() !="") hp.setMainImg3(item.getName());
}
if(item.getFieldName().equals("promoimg1"))
{
promo = true;
if(item.getName() !="")
{
hp.setPromoImg1(item.getName());
try {
File savedFile = new File("/Library/resin-4.0.1/webapps/ROOT/images/promoImg1.jpg");
item.write(savedFile);
//System.err.print(items);
} catch (Exception e) {
System.err.println(e.getMessage());
}
}
}
if(item.getFieldName().equals("promoimg2"))
{
if(item.getName() !="")
{
hp.setPromoImg2(item.getName());
try {
File savedFile = new File("/Library/resin-4.0.1/webapps/ROOT/images/promoImg2.jpg");
item.write(savedFile);
//System.err.print(items);
} catch (Exception e) {
System.err.println(e.getMessage());
}
}
}
if(item.getFieldName().equals("promoimg3"))
{
if(item.getName() !="")
{
hp.setPromoImg3(item.getName());
try {
File savedFile = new File("/Library/resin-4.0.1/webapps/ROOT/images/promoImg3.jpg");
item.write(savedFile);
//System.err.print(items);
} catch (Exception e) {
System.err.println(e.getMessage());
}
}
}
System.err.println("FNAME =" + item.getFieldName() + " : " + item.getName());
if (item.isFormField()) {
}
else {
try {
if(!promo)
{
String itemName = item.getName();
File savedFile = new File("/Library/resin-4.0.1/webapps/ROOT/images/"+itemName);
item.write(savedFile);
}
//System.err.print(items);
} catch (Exception e) {
System.err.println(e.getMessage());
}
}
}
}
}
db.updateHomePageContent(hp);
我以前也有类似的问题。我可以找到问题的唯一方法是将fileupload放入它自己的形式。
当使用multipart/form-data
,正常输入字段值不可通过request.getParameter()
因为之前的3.0版本的标准Servlet API中不具有内置设施,分析它们。这正是Apache Commons FileUpload存在的原因。您需要检查FileItem#isFormField()
是否返回true
,然后从FileItem
收集它们。
现在你忽略了代码中的这些值。无可否认,FileItem
是一个误导性的名称,如果是我的话,我称它为MultipartItem
或者Part
代表multipart/form-data
正文的一部分,它包含上传字段和正常参数。
这里有一个开球例如,你应该如何正确地解析multipart/form-data
要求:
List<FileItem> items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
for (FileItem item : items) {
if (item.isFormField()) {
// Process normal fields here.
System.out.println("Field name: " + item.getFieldName());
System.out.println("Field value: " + item.getString());
} else {
// Process <input type="file"> here.
System.out.println("Field name: " + item.getFieldName());
System.out.println("Field value (file name): " + item.getName());
}
}
请注意,还忽视了一个MSIE不当行为,并将其发送沿文件名全客户端的路径。你想从item.getName()
修剪它作为每FileUpload FAQ:
String fileName = item.getName();
if (fileName != null) {
filename = FilenameUtils.getName(filename);
}
我正在使用Struts 1.3和ServletFileUpload(new DiskFileItemFactory()) .parseRequest(请求);用multipart/form-data表单返回null(http://*.com/questions/18759688/java-servlet-issue-with-multipart-form-data-form)。 – Sefran2 2013-09-12 09:25:58
您应该使用Struts提供的文件上传功能。阅读其文档。 – BalusC 2013-09-12 10:12:41
你的意思是FormFile类吗?我有一个以json格式编码的动态表单,所以我“亲手处理”请求。 – Sefran2 2013-09-12 11:30:10
if (item.isFormField()) {
// Process normal fields here.
System.out.println("Field name: " + item.getFieldName());
System.out.println("Field value: " + item.getString());'
}
这是访问表单字段值的代码,但如果我有2场 1名,另一种是地址
<input type="text" name=name>
<input type="text" name=address>
如何separatly访问这些字段的值,并插入到数据库中。
是的,如果可能的话,我需要这是1形式。我相信它必须与servlet有关,因为我可以将值发布到url字符串,并且它们看起来正确,但是servlet抓取的值为空 – kbrin80 2009-10-12 14:25:40