springMVC + hadoop + httpclient 文件上传请求直接写入hdfs

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springMVC + hadoop + httpclient 文件上传请求直接写入hdfs相关的知识,希望对你有一定的参考价值。

1、首先是一个基于httpclient的java 应用程序,代码在这篇文章的开头:点击打开链接

2、我们首先写一个基于springMVC框架的简单接收请求上传的文件保存本地文件系统的demo,程序代码在这:点击打开链接,不过因为之后与hadoop所以来的jar包同时使用,加上有一些三方jar包可能会冲突,这里我们简化这个demo里面maven所依赖的选项,更新的pom文件如下:

 

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  
  <modelVersion>4.0.0</modelVersion>  
  <groupId>springmvx</groupId>  
  <artifactId>springmvx</artifactId>  
  <version>0.0.1-SNAPSHOT</version>  
  <packaging>war</packaging>  
  <build>  
    <sourceDirectory>src</sourceDirectory>  
    <plugins>  
      <plugin>  
        <artifactId>maven-compiler-plugin</artifactId>  
        <version>3.3</version>  
        <configuration>  
          <source>1.7</source>  
          <target>1.7</target>  
        </configuration>  
      </plugin>  
      <plugin>  
        <artifactId>maven-war-plugin</artifactId>  
        <version>2.6</version>  
        <configuration>  
          <warSourceDirectory>WebContent</warSourceDirectory>  
          <failOnMissingWebXml>false</failOnMissingWebXml>  
        </configuration>  
      </plugin>  
    </plugins>  
  </build>  
  <dependencies> 
      <dependency>    
        <groupId>jstl</groupId>    
        <artifactId>jstl</artifactId>    
        <version>1.2</version>    
    </dependency>
    <dependency>    
        <groupId>org.springframework</groupId>    
        <artifactId>spring-webmvc</artifactId>    
        <version>3.1.1.RELEASE</version>    
    </dependency> 
      <dependency>    
        <groupId>org.springframework</groupId>    
        <artifactId>spring-web</artifactId>    
        <version>3.1.1.RELEASE</version>    
    </dependency>   
    <dependency>  
        <groupId>commons-fileupload</groupId>  
        <artifactId>commons-fileupload</artifactId>  
        <version>1.3.1</version>  
    </dependency> 
    <dependency>  
        <groupId>jdk.tools</groupId>  
        <artifactId>jdk.tools</artifactId>  
        <version>1.7</version>  
        <scope>system</scope>  
        <systemPath>${JAVA_HOME}/lib/tools.jar</systemPath>  
    </dependency>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-client</artifactId>
        <version>2.6.0</version>
    </dependency>  
  </dependencies>  
</project>

 

3、我们将springMVC控制器里的代码稍加修改,改为直接上传文件到hdfs,而不是本地文件系统,代码如下:

 

package net.spring.controller;

import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.disk.DiskFileItem;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import org.springframework.web.servlet.ModelAndView;

import com.busymonkey.hadoop.*;

@Controller  
public class HelloWorldController {
    
    @RequestMapping("/hello")  
    public ModelAndView hello() {   
        String message = "Hello World, Spring 3.0!";  
        System.out.println(message);  
        return new ModelAndView("hello1", "message", message);  
    }   
    @RequestMapping("/upload") 
    public String upLoad(HttpServletRequest request, HttpServletResponse response) 
            throws IllegalStateException, IOException{
        //解析器解析request的上下文
        CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext()); 
        //先判断request中是否包涵multipart类型的数据,
        if(multipartResolver.isMultipart(request)) {
            //再将request中的数据转化成multipart类型的数据
            MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
            Iterator<String> iter = multiRequest.getFileNames();
            while(iter.hasNext()) {
                MultipartFile file = multiRequest.getFile((String)iter.next());
                if(file != null) {
                    CommonsMultipartFile cf= (CommonsMultipartFile)file; 
                    DiskFileItem fi = (DiskFileItem)cf.getFileItem(); 
                    File inputFile = fi.getStoreLocation();
                    HdfsFileSystem.createFile(inputFile, "hdfs://192.168.241.149:9000/upload/1.mp4");                                       
                }
            }
        }
        return "/hello1";
    }
}

 

4、同时我们再新建一个hdfs的工具类,在上面的类中有引用,代码如下:

 

package com.busymonkey.hadoop;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;

public class HdfsFileSystem {    
    /** 
     * 按路径上传文件到hdfs
     * @param conf 
     * @param local 
     * @param remote 
     * @throws IOException 
     */  
    public static void copyFile(Configuration conf , String uri , String local, String remote) throws IOException {  
        FileSystem fs = FileSystem.get(URI.create(uri), conf);  
        fs.copyFromLocalFile(new Path(local), new Path(remote)); 
        System.out.println("copy from: " + local + " to " + remote);  
        fs.close();  
    }  
    
    /** 
     * 按路径下载hdfs上的文件 
     * @param conf 
     * @param uri 
     * @param remote 
     * @param local 
     * @throws IOException 
     */  
    public static void download(Configuration conf , String uri ,String remote, String local) throws IOException {  
           Path path = new Path(remote);  
           FileSystem fs = FileSystem.get(URI.create(uri), conf);  
           fs.copyToLocalFile(path, new Path(local));  
           System.out.println("download: from" + remote + " to " + local);  
           fs.close();  
   } 
    
    /** 
     * File对象上传到hdfs 
     * @param conf 
     * @param uri 
     * @param remote 
     * @param local 
     * @throws IOException 
     */  
    public static void createFile(File localPath, String hdfsPath) throws IOException {  
        InputStream in = null;  
        try {  
            Configuration conf = new Configuration();  
            FileSystem fileSystem = FileSystem.get(URI.create(hdfsPath), conf);  
            FSDataOutputStream out = fileSystem.create(new Path(hdfsPath));  
            in = new BufferedInputStream(new FileInputStream(localPath));  
            IOUtils.copyBytes(in, out, 4096, false);  
            out.hsync();  
            out.close();  
            System.out.println("create file in hdfs:" + hdfsPath);  
        } finally {  
            IOUtils.closeStream(in);  
        }  
    }
}

 

 


其他代码跟本地上传文件的demo是一样的。结果如下:

 

技术分享

 

5、jsp页面提交文件上传请求,不使用 java 应用 httpclient,将 index.jsp 修改如下:

 

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"  pageEncoding="ISO-8859-1"%>  
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
<html>  
<head>  
    <title>Spring 3.0 MVC demo</title>  
</head>  
<body>  
    <a href="hello.html">Say Hello</a> 
    <h3>upload :</h3>
    Please choose the file :<br />
    <form action="upload.html" method="post" enctype="multipart/form-data">
        <input type="file" name="file" size="50" />
        <br />
    <input type="submit" value="Upload" />
    </form> 
</body>  
</html>

 

 


6、将hello1.jsp 重命名为 result.jsp,代码如下:

 

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"  
    pageEncoding="ISO-8859-1"%>  
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
<html>  
    <head>  
        <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">  
        <title>result</title>  
    </head>  
    <body>  
        <p>success!</p>  
    </body>  
</html>

原文:http://blog.csdn.net/dopamy_busymonkey/article/details/51036248

 

以上是关于springMVC + hadoop + httpclient 文件上传请求直接写入hdfs的主要内容,如果未能解决你的问题,请参考以下文章

SpringMVC 主要组件说明

SpringMVC响应的HTTP状态码

SpringMVC响应的HTTP状态码

SpringMVC响应的HTTP状态码

Springmvc构造RESTful详细讲解

Springmvc构造RESTful详细讲解