gpt4 book ai didi

java - 在 'handled' 相同表单的文本字段后,文件未上传

转载 作者:行者123 更新时间:2023-12-02 07:49:51 25 4
gpt4 key购买 nike

以下 Servlet 处理照片和该照片的标题的上传。 servlet 工作正常(将照片上传到请求的目录),直到添加了处理相同来源的文本字段的逻辑。现在它既不上传照片也不将标题提交到数据库。该表单的 enctype 为 multipart/form-data

HTML

    <form method="post" action="UploadHandler" enctype="multipart/form-data">
<table>

<tr>
<td> <strong> Browse photo to submit </strong> </td>
<td> <input type="file" name="ImageToUpload" value="Upload Photo"/> </td>
</tr>

<tr>
<td> <strong> Give a Caption to this photo </strong> </td>
<td> <input type="text" name="CaptionBox" size="40" /></td>
</tr>

<tr>
<td> <strong> Tags &nbsp;<a href="#"> <i> Browse tags </i> </a> </strong> </td>
<td> <input type="text" size="20" value="Tags" id="tagfield" style="color: #A0A0A4; font-size:16px;" onfocus="emptyTheDefaultValue()"> </td>
</tr>
<tr colspan="2">
<td> <input type="submit" value="submit photo"/> </td>
</tr>

</table>
</form>

处理上传的Servlet

package projectcodes;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.File;
import java.util.List;
import java.util.Iterator;
import org.apache.commons.fileupload.*;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FilenameUtils;
import NonServletFiles.HandleCaption;
import NonServletFiles.ChangePartToString;

public class UploadHandler extends HttpServlet {
@Override
public void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException {
response.setContentType("text/plain");
String path = request.getParameter("ImageToUpload");
// Now handle the caption
// Note : They have a multipart/form-data request
// Using the servlet API 3.0
ChangePartToString cpts = new ChangePartToString(request.getPart("CaptionBox")); // get the CaptionBox part
String caption = null;

try {
caption = cpts.getValue();
System.out.println(caption); // <<-------- I get this value fine
}catch(Exception exc) {
exc.printStackTrace();
System.out.println(exc);
}

PrintWriter writer = response.getWriter();
try {
Boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if(!isMultipart) {
Boolean AttemptToUploadFile = true;
RequestDispatcher rd = request.getRequestDispatcher("portfolio_one.jsp");
request.setAttribute("UploadAttempt", AttemptToUploadFile);
rd.forward(request, response);
} else {
DiskFileItemFactory diskFileItem = new DiskFileItemFactory();
ServletFileUpload fileUpload = new ServletFileUpload(diskFileItem);
List list = null;

try {
list = fileUpload.parseRequest(request);
}catch(Exception exc) {
// Boolean AttemptToUploadFile = true;
// RequestDispatcher rd = request.getRequestDispatcher("portfolio_one.jsp");
// request.setAttribute("UploadAttempt", AttemptToUploadFile);
// rd.forward(request, response);
exc.printStackTrace();
System.out.println(exc);
}

Iterator iterator = list.iterator();
while(iterator.hasNext()) {
String emailOfTheUser = null;
FileItem fileItem = (FileItem)iterator.next();
if(!fileItem.isFormField()) {
String fieldName = fileItem.getFieldName();
String fileName = FilenameUtils.getName(fileItem.getName());
HttpSession session = request.getSession();
if(!session.isNew()) {
emailOfTheUser = (String)session.getAttribute("Email");
}
File file = new File("/home/non-admin/project uploads/project users/" + emailOfTheUser ,fileName);
fileItem.write(file);
// now since the file has been uploaded , upload the caption to the photo
System.out.println("THE CAPTION :" + caption);
HandleCaption hc = new HandleCaption(caption,emailOfTheUser,fileName);
hc.SubmitCaptionToTheDatabase(); // This calls invokes a method that submits a caption to the database
RequestDispatcher rd = request.getRequestDispatcher("portfolio_one.jsp");
String message = "File Uploaded successfully !";
request.setAttribute("SuccessMessage", message);
rd.forward(request, response);
}
}
}
}catch(Exception exc) {
exc.printStackTrace();
System.out.println(exc);
}
}

}

标题字符串返回正常。文件未上传可能是什么原因。我在服务器日志中没有看到任何异常。

最佳答案

您将 Servlet 3.0 内置多部分解析器与 Apache Commons FileUpload 混合在一起。你不应该那样做。一旦请求正文被一个 API 解析,就无法再被另一个 API 解析。客户端不会多次重新发送相同的请求正文,因为服务器需要解析它。

删除 Apache Commons FileUpload。当已经使用 Servlet 3.0 内置的多部分解析器时,您不需要它。您只需向 servlet 类添加 @MultipartConfig 注释即可使多部分解析器对普通表单字段和文件字段正确工作。您也不应该使用 getParameterXxx() 方法。另请参阅How to upload files to server using JSP/Servlet?

以下是对代码的必要重写,以便获得这两个值:

@WebServlet("/UploadHandler")
@MultipartConfig
public class UploadHandler extends HttpServlet {

@Override
public void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException {
Part imageToUpload = request.getPart("ImageToUpload");
String imageFilename = getFilename(imageToUpload);
InputStream imageContent = imageToUpload.getInputStream();
String captionBox = getValue(request.getPart("CaptionBox"));

// ...
}

private static String getFilename(Part part) {
for (String cd : part.getHeader("content-disposition").split(";")) {
if (cd.trim().startsWith("filename")) {
String filename = cd.substring(cd.indexOf('=') + 1).trim().replace("\"", "");
return filename.substring(filename.lastIndexOf('/') + 1).substring(filename.lastIndexOf('\\') + 1); // MSIE fix.
}
}
return null;
}

private static String getValue(Part part) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(part.getInputStream(), "UTF-8"));
StringBuilder value = new StringBuilder();
char[] buffer = new char[1024];
for (int length = 0; (length = reader.read(buffer)) > 0;) {
value.append(buffer, 0, length);
}
return value.toString();
}

}

关于java - 在 'handled' 相同表单的文本字段后,文件未上传,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10348040/

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