Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我能';在jsp中上载文件后,是否无法从请求中访问参数?_Java_Jsp_Servlets_Email Attachments - Fatal编程技术网

Java 为什么我能';在jsp中上载文件后,是否无法从请求中访问参数?

Java 为什么我能';在jsp中上载文件后,是否无法从请求中访问参数?,java,jsp,servlets,email-attachments,Java,Jsp,Servlets,Email Attachments,我正在使用jsp和servlet来实现这一点 我有一个联系表格,可以发送一封包含一些数据(姓名、主题、问题、联系电子邮件等)和文件的电子邮件 当我提交表单并得到servlet响应时,只返回第一件事 String file= fileUpload(request); //upload the client's file and return the absolute path of the file in the server //testing the rest of paramete

我正在使用jsp和servlet来实现这一点

我有一个联系表格,可以发送一封包含一些数据(姓名、主题、问题、联系电子邮件等)和文件的电子邮件

当我提交表单并得到servlet响应时,只返回第一件事

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");
按照此顺序,文件上载成功,但其他参数(名称、邮件等)为空


按照以下顺序,参数正常,它们正确返回数据。但是文件没有上传

//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

我怎么能两者兼得呢?
谢谢

您应该使用与提取上传文件相同的API(例如Apache Commons FileUpload)提取请求参数。这通常不能与调用
getParameter()
互换,因为请求主体只能解析一次(最终用户不会发送同一个请求两次,一次由文件上载解析API解析,另一次由
getParameter()
解析)

另见:

查看以下代码是否对您有所帮助。这只是一个例子。你可能得调整一下

创建一个名为
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 handleMultiPartRequest(HttpServletRequest)
抛出FileSizeLimitExceedeException
{
如果(!isMultipartRequest(请求))
返回null;
ServletFileUpload=FileUploader.getservletFileUploader(tempDir,50);
MultiPartFormData data=新的MultiPartFormData();
尝试
{
列表项=upload.parseRequest(请求);
用于(文件项:项)
{
if(item.isFormField())
{
data.getParameters().put(item.getFieldName(),item.getString());
}
其他的
{
字符串文件名=item.getName();
//Internet explorer和firefox将以不同的方式发送文件名
//Internet explorer将发送文件名的完整路径,包括
//反斜杠字符等等…我们应该去掉它
//这是哈奇
if(filename.indexOf(“\\”)!=-1)
{
int index=filename.lastIndexOf(“\\”);
filename=filename.substring(索引+1);
}
if(filename==null | | filename.equals(“”)
{
//无所事事
}
其他的
{
File uploadFile=新文件(uploadDir+File.separator+randomFileName);
item.write(上传文件);
data.addFile(item.getFieldname(),item.getString());
}
}
}
}
捕获(FileSizeLimitExceedeException e)
{
投掷e;
}
捕获(例外e)
{
e、 printStackTrace();
}
返回数据;
}
解析请求后,我将其存储在一个名为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);
    }
}
公共类MultiPartFormData{
私有哈希表参数;
私有哈希表上传文件;
公共MultiPartFormData()
{
this.parameters=新哈希表();
this.uploadedFiles=新哈希表();
}
公共哈希表getParameters(){
返回参数;
}
公共void setParameters(哈希表参数){
此参数=参数;
}
public void getParameter(字符串paramName){
if(this.parameters.contains(paramName))
返回tyhis.parameters.get(paramName);
返回null;
}
public void addFile(字符串键、字符串文件名){
uploadedFile.put(键,文件名);
}
public void getFilename(字符串键){
uploadedFile.get(密钥);
}
}

至于提取文件名,只需使用
FilenameUtils#getName()
,正如Apache Commons FileUpload的文档(以及我的答案中“请参阅”链接后面的代码示例)所示。感谢您的回答,我可以上载de文件,但我无法从MultiPartFormData数据中获取de参数。你是怎么做到的?要上传文件,我使用以下代码MultiPartFormData=handleMultiPartRequest(request);使用字符串参数=data.getParameter(paramName);它只是查找我们在处理多部分数据时填充的哈希表。它不工作,我通过将参数保存为会话参数来解决这个问题<代码>如果(item.isFormField()){session.setAttribute(item.getFieldName(),item.getString());谢谢您的回答!不要将此存储在会话中…我已经更新了一点代码…您可以使用另一个映射将文件名与参数名映射,然后可以查询multipartformdata