`
奔跑的羚羊
  • 浏览: 577553 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

nginx upload在java中的应用

    博客分类:
  • java
阅读更多
1.Nginx上传介绍

    文件在POST上传到nginx服务器时,nginx会自己将这个文件先保存下来,然后再往后端发送。
    在这个过程中,文件会被保存成一个临时文件,待文件传送完成后,nginx向后端(如resin)通知临时文件的文件信息(如上传文件原有的文件名、存在本地磁盘哪个目录下、临时文件名、文件的md5、文件的类型、文件的大小等)。
    后端服务拿到这个文件名可以直接读取缓存的文件,进行迁移转码等后续逻辑。


2.安装
下载nginx upload模块
http://www.grid.net.ru/nginx/upload.en.html
tar zxvf nginx_upload_module-2.2.0.tar.gz


在nginx添加该模块
./configure --prefix=/usr/local/nginx --with-pcre=/root/pcre-8.11 --with-http_stub_status_module --with-http_realip_module --add-module=/root/nginx_upload_module-2.2.0 --add-module=/root/masterzen-nginx-upload-progress-module-3d8e105/


3.配置nginx.conf
        # Upload form should be submitted to this location
        location /upload {
                # Pass altered request body to this location
                upload_pass   @test;

                upload_pass_args  on;
                upload_max_file_size 1m;

                # Store files to this directory
                # The directory is hashed, subdirectories 0 1 2 3 4 5 6 7 8 9 should exist
                upload_store /tmp 1;

                # Allow uploaded files to be read only by user
                upload_store_access user:r;
                # Set specified fields in request body
                upload_set_form_field "${upload_field_name}.name" $upload_file_name;
                upload_set_form_field "${upload_field_name}.content_type" $upload_content_type;
                upload_set_form_field "${upload_field_name}.path" $upload_tmp_path;

                # Inform backend about hash and size of a file
                #upload_aggregate_form_field "${upload_field_name}.md5" $upload_file_md5;
                upload_aggregate_form_field "${upload_field_name}.crc32" $upload_file_crc32;
                upload_aggregate_form_field "${upload_field_name}.size" $upload_file_size;
                upload_pass_form_field "^submit$|^test$";

                upload_cleanup 400 404 499 500-505;

        }

        # Pass altered request body to a backend
        location @test {
                proxy_pass   http://resin;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }


指定上传文件的大小
    keepalive_timeout  200;
    client_max_body_size 100m;


二、.resin端程序的接收
1.上传的页面index.html
<html>
<head>
<title>Test upload</title>
</head>
<body>
   <form enctype="multipart/form-data" action="/upload.so" method="post">
<input type="hidden" name="test" value="上传">

    选择文件1:
    <input type="file" name="filename1" />
    <br />
    选择文件2:
    <input type="file" name="filename2" />
    <br />
    选择文件3:
    <input type="file" name="filename3" />
    <br />
    <input type="submit" value="上载" />
   </form>
</body>


2.添加一个Servlet.修改web.xml
	<servlet>
      <servlet-name>upload</servlet-name>
      <servlet-class>com.XXX.servlet.Upload</servlet-class>
    </servlet>
     <servlet-mapping>
      <servlet-name>upload</servlet-name>
      <url-pattern>/upload.so</url-pattern>
    </servlet-mapping>


3.编写Servlet,
将file的信息封装到upFiles的map中。
页面的其他信息(如:test),封装到agrs的map中
package com.XXXX.web.servlet;

import java.io.IOException;
import java.lang.reflect.Method;
import java.text.MessageFormat;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import com.XXXX.model.UpFile;
import com.XXXX.UploadManager;

/**
 * @author winston
 * 
 */
public class Upload  extends HttpServlet{

	private final Log log = LogFactory.getLog(Upload.class);
	
	private Map<String, UpFile> upFiles = new HashMap<String, UpFile>();
	
	private Map<String, String> agrs = new HashMap<String, String>();
	
	private ServletInputStream sis = null; //
	
	private byte[] b = new byte[4096]; //
	
	private static String rturl = "http://XXXXXX/ok.html";
	
	public static final String  FILE_NAME="filename";
	
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

	     ServletContext application = getServletContext();  
	     WebApplicationContext wac = WebApplicationContextUtils.getWebApplicationContext(application);//获取spring的context  
	     UploadManager uploadManager = (UploadManager) wac.getBean("uploadManager");  
		
		sis = request.getInputStream();
		int a = 0;
		int k = 0;
		String s = "";
		while ((a = sis.readLine(b, 0, b.length)) != -1) {
			s = new String(b, 0, a);
			
			if ((k = s.indexOf("name=\"")) != -1) {
				String fieldName = s.substring(k + 6, s.length() - 3);
				sis.readLine(b, 0, b.length);
				StringBuffer fieldValue = new StringBuffer(b.length);
				while ((a = sis.readLine(b, 0, b.length)) != -1) {
					s = new String(b, 0, a - 2);
					if ((b[0] == 45) && (b[1] == 45) && (b[2] == 45)
							&& (b[3] == 45) && (b[4] == 45)) {
						break;
					} else {
						fieldValue.append(s);
					}
				}

				
				if(fieldName.startsWith(FILE_NAME)){
					setField(fieldName, fieldValue.toString());
				}else{
					agrs.put(fieldName, fieldValue.toString());
				}
				
				
				
//				fields.put(fieldName, fieldValue.toString());
			}
		}
		

		//业务处理
		uploadManager.saveUpload(upFiles, agrs);
		
		response.sendRedirect(rturl);
	}
	
	private void setField(String file_name, String file_value){

		String[] str = file_name.split("\\.");
		UpFile upFile = null;
		if(upFiles.containsKey(str[0])){
			upFile = upFiles.get(str[0]);            
		}else{
			upFile = new UpFile();
		}
		
		String fieldName = str[1];
		String value = file_value;
		
        String setMethodName = "set" + Character.toUpperCase(fieldName.charAt(0)) + fieldName.substring(1);
        
        
        try {
            Method setMethod = upFile.getClass().getMethod(setMethodName, String.class);
            if (value != null) {
                setMethod.invoke(upFile, value);
            }
        } catch (Exception e) {
            e.printStackTrace();
            log.error(MessageFormat.format("Could not set ''{0}.{1} with value {2}",
            		upFile, fieldName, value));
        }
        
        upFiles.put(str[0], upFile);
	}

}


2。对应nginx传递的参数,封装的对象
package com.XXX.model;

import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;

public class UpFile {

	private String name;
	
	private String content_type;
	
	private String path;
	
	private String crc32;
	
	private String size;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getContent_type() {
		return content_type;
	}

	public void setContent_type(String content_type) {
		this.content_type = content_type;
	}

	public String getPath() {
		return path;
	}

	public void setPath(String path) {
		this.path = path;
	}

	public String getCrc32() {
		return crc32;
	}

	public void setCrc32(String crc32) {
		this.crc32 = crc32;
	}

	public String getSize() {
		return size;
	}

	public void setSize(String size) {
		this.size = size;
	}
	
	public String toString() {
		return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
				.append("name", this.name)
				.append("content_type", this.content_type)
				.append("path", this.path)
				.append("crc32", this.crc32)
				.append("size", this.size)
				.toString();
	}

	/**
	 * @see java.lang.Object#equals(Object)
	 */
	public boolean equals(Object object) {
		if (!(object instanceof UpFile)) {
			return false;
		}
		UpFile rhs = (UpFile) object;
		return new EqualsBuilder().appendSuper(super.equals(object)).append(
				this.content_type, rhs.content_type)
				.append(this.size, rhs.size).append(this.path, rhs.path)
				.append(this.crc32, rhs.crc32).append(this.name, rhs.name)
				.isEquals();
	}

	/**
	 * @see java.lang.Object#hashCode()
	 */
	public int hashCode() {
		return new HashCodeBuilder(-404694209, 2059458549).appendSuper(
				super.hashCode()).append(this.content_type).append(this.size)
				.append(this.path).append(this.crc32).append(this.name)
				.toHashCode();
	}
	
	
}


3.业务处理uploadManager就按自己的需求写就可以了


0
0
分享到:
评论
2 楼 yhq1212 2015-08-16  
如何禁止NGINX先本地缓存呢
1 楼 zhaoshuli99 2011-01-17  
你还搞了个博客,呵呵;
这个upload还行吧,但不能断点续传

相关推荐

    nginx upload在java中的应用.doc

    ngx_upload_module是Nginx的一个第三方...前端提交文件至Nginx,Nginx负责存储和传递文件信息,后端Java应用则可以专注于业务逻辑处理,如文件迁移、转码等。这种方式不仅简化了处理流程,还提升了系统的并发处理能力。

    nginx1.16+nginx-upstream-check-module-master+nginx-upload-module

    在IT行业中,Nginx是一款广泛应用的高性能反向代理服务器,因其高效稳定和灵活的配置而备受青睐。这里我们关注的是一个包含特定模块的Nginx配置:`nginx1.16`,`nginx-upstream-check-module-master` 和 `nginx-...

    Java操作FastDFS文件上传

    首先,我们需要在项目中引入`fastdfs-client-java`依赖。通常,可以通过Maven或Gradle将该库添加到构建文件中。对于Maven用户,可以在`pom.xml`文件中添加如下依赖: ```xml &lt;groupId&gt;org.csource &lt;artifactId&gt;...

    nginx TOMCAT 文件下载 上传 进度条 缓存

    在实际应用中,Nginx通常作为前端服务器,处理静态文件请求,而将动态请求转发给后端的Tomcat处理。 2. **文件下载** 在Nginx中,可以通过配置`location`指令来指定处理特定路径下的文件下载请求。同时,Nginx支持...

    windows下分布式部署Mysql、Redis、Zookeeper、Nginx、FastDFS集合

    - 在浏览器中访问 `http://localhost` 来确认 Nginx 是否正常工作。 #### FastDFS 安装与配置 FastDFS 是一个轻量级的分布式文件系统,提供了文件存储和检索功能。 1. **下载 FastDFS:** - 访问官方网站或 ...

    Nginx上传文件全部缓存解决方案

    Nginx作为一款高性能的HTTP和反向代理服务器,它在处理文件上传时,为了提高效率和稳定性,会默认将上传的数据临时存储在本地内存或磁盘中,然后一次性转发到后端应用服务器。然而,这种行为在某些情况下可能会造成...

    ckeditor上传图片

    在`ckeditorUploadImgApi.java`中,可能包含了处理图片上传的函数,比如`uploadImage()`,这个函数会接收前端通过CKEditor发送的图片数据,然后将图片保存到服务器的指定目录,并返回一个包含上传结果的JSON对象,...

    fastdfs-java客户端代码

    1. 异常处理:在实际应用中,需要对可能出现的网络异常、文件操作异常等进行捕获和处理,保证系统的健壮性。 2. 并发支持:在高并发环境下,可以考虑使用线程池来优化文件上传下载的效率,同时避免过多的并发请求对...

    file-upload.rar

    在IT行业中,文件上传是常见的应用场景,特别是在Web开发中。本教程将重点讲解如何使用SpringBoot、Nginx和FTP来实现图片资源的上传。这个压缩包“file-upload.rar”包含了一个实际工作中的实例,旨在帮助开发者理解...

    FCKeditor配置for java

    在Java Web开发环境中,集成FCKeditor可以提升用户体验,使得内容创建和编辑更为便捷。下面将详细介绍如何在Java Web项目中配置和使用FCKeditor。 1. **下载与解压** 首先,你需要从FCKeditor的官方网站下载最新...

    实例详解SpringBoot+nginx实现资源上传功能

    在本文中,我们将深入探讨如何使用SpringBoot与Nginx集成来实现资源上传功能。SpringBoot以其简洁的配置和强大的功能被广泛应用于构建微服务应用,而Nginx则是一款高性能的HTTP和反向代理服务器,常用于处理静态资源...

    fastdfs-client-java.rar

    在本篇文章中,我们将深入探讨其Java客户端——`fastdfs-client-java`的使用方法、核心特性以及实际应用场景。 `fastdfs-client-java`是FastDFS官方提供的Java语言版本的客户端库,版本号为1.29,它允许Java开发者...

    Java实现上传文件图片到指定服务器目录

    在Java中实现上传文件图片到指定服务器目录是非常重要的功能,它可以帮助开发者快速实现文件上传功能。本文将通过实例代码,详细介绍Java实现上传文件图片到指定服务器目录的相关知识点。 一、Java文件上传的基本...

    fastdfs客户端使用(java-API)及安装教程,支持防盗链(token)和缩略图等功能.zip

    这需要在Nginx配置中启用防盗链规则,并在Java客户端生成和验证Token。 6. **生成缩略图**:FastDFS本身并不支持直接生成缩略图,但可以在Java客户端处理上传的图片后生成缩略图,再上传到FastDFS。另一种方式是在...

    FastDFS 文件分布式存储linux配置+javaDemo一个

    FastDFS提供了Java客户端API,用于在Java应用中与FastDFS交互。首先,将FastDFS的Java客户端jar包添加到项目类路径中。然后,可以创建FastDFSClient实例,通过它来执行文件上传、下载、删除等操作。 例如,文件上传...

    FastDFS分布式文件系统的安装说明书1

    - 提供的`fastdfs_client_java.tar.gz`包是FastDFS的Java客户端,可以用于Java应用中与FastDFS交互。 9. **网络协议**: - FastDFS使用自定义的二进制协议进行通信,这使得它能高效地处理大量小文件的上传和下载...

    在LayUI图片上传中,解决由跨域问题引起的请求接口错误的方法

    在Java的Spring框架中,可以通过在Controller方法上添加注解`@CrossOrigin`来开启CORS。例如,在上述示例的`FileController`类的`upLoad`方法中,可以添加以下代码: ```java @CrossOrigin(origins = "*", ...

    struts2 文件上传 测试通过版

    在实际应用中,需要注意安全性问题,如限制文件大小、验证文件类型、避免路径遍历攻击等。此外,上传的文件通常不应保存在Web应用的根目录下,以防止直接访问。 8. **结果展示**: 文件上传成功后,可以将文件的...

    高级Java人才培训专家-03-自媒体文章发布

    根据给定文件的信息,我们可以提炼出以下几个核心知识点: ### 一、自媒体文章发布与管理系统架构 ...这对于Java开发者来说是一份非常实用的学习资料,能够帮助他们快速掌握相关技能并应用于实际项目开发中。

Global site tag (gtag.js) - Google Analytics