2

これを行うためにjspとサーブレットを使用しています。

いくつかのデータ(名前、件名、質問、連絡先メールなど)とファイルを含むメールを送信する連絡フォームがあります。

フォームを送信してサーブレットの応答を取得すると、最初のものだけが返されます。

String file= fileUpload(request); //upload the client's file and return the absolute      path of the file in the server
//testing the rest of parameters
 out.println("REQUEST LIST"
              "\n"   request.getParameter("name")
              "\n"   request.getParameter("mail")
              "\n"   request.getParameter("subject")
              "\n"   request.getParameter("ask")
              "\n");

この順序でファイルは正常にアップロードされますが、他のパラメーター (名前、メールなど) は null です。


以下の順序で、パラメーターは問題なく、データを正しく返します。しかし、ファイルはアップロードされません。

//testing the rest of parameters
out.println("REQUEST LIST"
              "\n"   request.getParameter("name")
              "\n"   request.getParameter("mail")
              "\n"   request.getParameter("subject")
              "\n"   request.getParameter("ask")
              "\n");
String file= fileUpload(request); //upload the client's file and return the absolute      path of the file in the server

どうすれば両方を持つことができますか?ありがとう!

4

2 に答える 2

5

アップロードされたファイルを抽出したのと同じAPI (Apache Commons FileUpload など) を使用して、要求パラメーターを抽出する必要があります。getParameter()リクエストの本文は 1 回しか解析できないため、これは通常、呼び出しと交換できません (エンドユーザーが同じリクエストを 2 回送信することはありません。1 つはファイル アップロード解析 API によって解析され、もう 1 つは によって解析されますgetParameter())。

以下も参照してください。

于 2012-07-26T16:53:22.700 に答える
2

次のコードが役立つかどうかを確認してください。これはほんの一例です。あなたはそれを微調整する必要があるかもしれません

オブジェクトFileUploaderを返すというクラスを作成しますServletFileUpload

public class FileUploader 
{
private static ServletFileUpload uploader;

private FileUploader()
{

}

public static synchronized ServletFileUpload getservletFileUploader(String tempDir, int maxSizeInMB) 
{
    if(uploader == null)
    {
        DiskFileItemFactory factory = new DiskFileItemFactory();

        factory.setSizeThreshold(1024 * 1024);
        factory.setRepository(new File(tempDir));

        uploader = new ServletFileUpload(factory);

        uploader.setFileSizeMax(maxSizeInMB * 1024 * 1024);
    }

    return uploader;
}
}

これで、リクエストを処理してすべてのデータを読み取ることができます

    protected MultiPartFormData handleMultiPartRequest(HttpServletRequest request)
throws FileSizeLimitExceededException
{
    if(!isMultipartRequest(request))
        return null;

    ServletFileUpload upload = FileUploader.getservletFileUploader(tempDir, 50);
    MultiPartFormData data = new MultiPartFormData();
    try
    {
        List<FileItem> items = upload.parseRequest(request);

        for (FileItem item : items) 
        {
            if(item.isFormField())
            {
                data.getParameters().put(item.getFieldName(), item.getString());
            }
            else
            {
                String filename = item.getName();

                //Internet explorer and firefox will send the file name differently
                //Internet explorer will send the entire path to the file name including 
                //the backslash characters etc ... we should strip it down
                //THIS IS HACKY
                if(filename.indexOf("\\") != -1)
                {
                    int index = filename.lastIndexOf("\\");
                    filename = filename.substring(index + 1);
                }


                if(filename == null || filename.equals(""))
                {
                    //do nothing 
                }
                else
                {
                    File uploadFile = new File(uploadDir + File.separator + randomFileName);
                    item.write(uploadFile);

                                            data.addFile(item.getFieldname(), item.getString());
                }
            }
        }
    }
    catch(FileSizeLimitExceededException e)
    {
        throw e;
    }
    catch(Exception e)
    {
        e.printStackTrace();

    }


    return data;
}

リクエストを解析した後、リクエストパラメータを取得するために使用できる MultipartFormData というオブジェクトに保存しています

public class MultiPartFormData {

private Hashtable<String, String> parameters;
    private Hashtable<String, String> uploadedFiles;

public MultiPartFormData()
{
    this.parameters = new Hashtable<String, String>();
    this.uploadedFiles = new Hashtable<String, String>();
}

public Hashtable<String, String> getParameters() {
    return parameters;
}
public void setParameters(Hashtable<String, String> parameters) {
    this.parameters = parameters;
}
    public void getParameter(String paramName) {
          if(this.parameters.contains(paramName))
                 return tyhis.parameters.get(paramName);
          return null;
    }
    public void addFile(String key, String filename) {
        uploadedFile.put(key, filename);
    }
    public void getFilename(String key) {
        uploadedFile.get(key);
    }
}
于 2012-07-26T17:16:15.557 に答える