私はそのような問題に遭遇しました
私はHttpServlet
Javaでapachelibを実装しましたFileUpload
。
このコードを単純なJavaWebプロジェクトとしてテストし、Tomcatにデプロイすると、機能します。しかし、これをGrailsプロジェクトのサーブレットとしてデプロイすると、List<FileItem> items
常に空になります。
これは、Grailsの何かが、リクエストを実行する前にリクエストボディを消費しているためだと確信していますが、Grailsが自分の前でリクエストServlet
を消費しないように強制する方法がわかりません。
すでに記述されているJavaコードをGrailsと統合する必要があるため、プレーンなJavaサーブレットをgrailsプロジェクトに追加する必要があります。
サーブレットコードは次のとおりです。
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
List<FileItem> items = new ServletFileUpload(
new DiskFileItemFactory()).parseRequest(request);
for (FileItem item : items) {
if (item.isFormField()) {
String fieldname = item.getFieldName();
String fieldvalue = item.getString();
System.out.println(fieldname + "=" + fieldvalue);
} else {
String fieldname = item.getFieldName();
String filename = FilenameUtils.getName(item.getName());
InputStream filecontent = item.getInputStream();
String value = IOUtils.toString(filecontent);
System.out.println(fieldname + "=" + value);
}
}
} catch (FileUploadException e) {
throw new ServletException("Cannot parse multipart request.", e);
}
}
リクエストの本文を読み取り、sysoutに出力するだけです。
今私はフォームを持っています:
<html>
<body>
<form action="http://localhost:8080/Tst/photoServlet" method="post" enctype="multipart/form-data">
<input type="text" name="fieldId" value="field_photo"/>
<input type="file" name="Afile" />
<input type="submit" />
</form>
</body>
</html>
web.xml
Grailsにそのようなマッピングも追加しました:
<servlet>
<servlet-name>photoServlet</servlet-name>
<servlet-class>com.tst.PhotoUploadServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>photoServlet</servlet-name>
<url-pattern>/ws/photoUpload</url-pattern>
</servlet-mapping>