gpt4 book ai didi

java - 多部分/表单数据的问题

转载 作者:行者123 更新时间:2023-12-02 11:12:12 28 4
gpt4 key购买 nike

当我的表单包含多部分/表单数据时,我无法从 servlet 中的文件和文本输入获取值。我正在使用 apache.commons.fileuploads 来帮助上传。有什么建议。另外,在下面的代码中,有一些我认为应该更有效的东西。有没有更好的方法将这些多个文件存储在数据库中。

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

最佳答案

使用 multipart/form-data 时,无法通过 request.getParameter() 获得正常的输入字段值,因为标准 Servlet 3.0 版本之前的 API 没有内置工具来解析它们。这正是 Apache Commons FileUpload 存在的原因。您需要检查 FileItem#isFormField() 是否返回 true,然后从 FileItem 中收集它们。

现在您忽略代码中的这些值。不可否认,FileItem 是一个误导性的名称,如果是我,我会称其为 MultipartItem 或只是 Part 代表 的一部分。 code>multipart/form-data body,其中包含上传的字段和普通参数。

这是一个启动示例,您应该如何正确解析 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 的错误行为,它会沿着文件名发送完整客户端路径。您想按照 FileUpload FAQ 将其从 item.getName() 中删除。 :

String fileName = item.getName();
if (fileName != null) {
filename = FilenameUtils.getName(filename);
}

关于java - 多部分/表单数据的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1545717/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com