Apache commons FileUploadを使用する
-
03-07-2019 - |
質問
これは機能しません。問題は、何が起こるかを知るのに十分な知識がないことです。このコードをデバッグできません。一時フォルダ" temp"にアップロードを保存したいそして、それらを「アプレット」に移動します。助けてください?サーブレットは明らかにアクセスされていますが、アップロードされたファイルが見つかりません...事前に感謝します。
フォーム(スクリプトレットを使用して作成されます-問題が発生する可能性がある場合、ここに配置します):
<%
out.write("<p>Upload a new game:</p>");
out.write("<form name=\"uploadForm\" action=\"game.jsp\" "
+ "method=\"POST\" enctype=\"multipart/form-data\">"
+ "<input type=\"file\" name=\"uploadSelect\" value=\"\" width=\"20\" />"
+ "<br><input type=\"submit\" value=\"Submit\" name=\"uploadSubmitButton\" "
+ "onclick = \"submitToServlet2('UploadGameServlet');\">"
+ "</form>");
%>
このjavascriptを呼び出す:
function submitToServlet2(newAction)
{
document.uploadForm.action = newAction;
}
次にサーブレットに移動します(いくつかの重要な要素が隠れている可能性があるため、コードは完全に含まれています)
package org.project;
import java.io.*;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
// import servlet stuff
import org.apache.commons.fileupload.*;
public class UploadGameServlet extends HttpServlet {
/**
* Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
* @param request servlet request
* @param response servlet response
*/
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
if (ServletFileUpload.isMultipartContent(request))
{
try
{
// Create a factory for disk-based file items
FileItemFactory factory = new DiskFileItemFactory();
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
// Parse the request
List items = upload.parseRequest(request); /* FileItem */
File repositoryPath = new File("\\temp");
DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
diskFileItemFactory.setRepository(repositoryPath);
Iterator iter = items.iterator();
while (iter.hasNext())
{
FileItem item = (FileItem) iter.next();
File uploadedFile = new File("\\applets");
item.write(uploadedFile);
}
}
catch (FileUploadException ex)
{
Logger.getLogger(UploadGameServlet.class.getName()).log(Level.SEVERE, null, ex);
}
catch (Exception ex)
{
Logger.getLogger(UploadGameServlet.class.getName()).log(Level.SEVERE, null, ex);
}
}
PrintWriter out = response.getWriter();
try {
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet UploadGameServlet</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Servlet UploadGameServlet at " + request.getContextPath () + "</h1>");
out.println("</body>");
out.println("</html>");
} finally {
out.close();
}
}
}
解決
File repositoryPath = new File("\\temp");
File uploadedFile = new File("\\applets");
先頭または絶対パスを使用せずにこれらのファイルにアクセスしようとすると、現在のディレクトリの下にある temp
および applets
という名前のファイル(ディレクトリではない)に書き込もうとしています。作業ディレクトリ。アプリサーバーでは、現在の作業ディレクトリは通常 bin
フォルダーです(使用しているアプリサーバーなどによって異なります)。
いくつかの提案:
- 絶対パス(web.xmlまたはプロパティファイルに保存されていることが望ましい)を使用して、ファイルを保存するディレクトリを参照します。
- 書き込み先のファイルの名前を指定する必要があります。おそらく、リクエストごとにランダムな名前を作成する必要があります。
- いくつかのキーストロークを保存し、すべての
Logger.getLogger(UploadGameServlet.class.getName())
参照の代わりにメンバー変数を使用します! - 特にデータの書き込み先を確認するためのデバッグを追加します。たとえば、
repositoryPath.getAbsolutePath()
の結果を記録します。
所属していません StackOverflow