45fan.com - 路饭网

搜索: 您的位置主页 > 网络频道 > 阅读资讯:上传和下载java文件的方法

上传和下载java文件的方法

2016-09-02 17:34:05 来源:www.45fan.com 【

上传和下载java文件的方法

import javax.servlet.*;

import javax.servlet.http.*;

import java.io.*;

public class HttpUtil {

/*

* binnary strut is: 1. [seperater] + 0x0D0A + 2. [header info,i.e.

* Disposition,name,filename...seperate is ;] + 0x0D0A+ 3.

* [Content-Type:xxx] + 0x0D0A + 0x0D0A 4. [Data bytes] + 0x0D0A + >> this

* may be binnary,can not change to string 5. [seperater] + 0x0D0A + 2,3,4

* repeated 6. [seperater] + 0x0D0A

*

*/

/**

* new line key

*/

public static byte[]CRLF= new byte[]{0x0d, 0x0a};

/**

* content key

*/

public static byte[]CRLF2= new byte[]{0x0d, 0x0a, 0x0d, 0x0a};

/**

* multipart form keywords

*/

public static StringMULTI_TYPE= "multipart/form-data";

/**

* normal form keywords

*/

public static StringNORMAL_TYPE= "application";

private String[]contentDisposition;

private String[]contentType;

private byte[][]data;

private String[]fieldString;

private String[]filename;

private booleanisMultipartForm= false;

private String[]name;

private intparamCount= 0;

private HttpServletRequestrequest;

private HttpServletResponseresponse;

private String[]value;

// read the request and set all fields

/**

* <pre>

* http tools

* </pre>

* @param requestrequest

* @param responseresponse

* @throws ServletExceptionServletException

* @throws IOException

*/

public HttpUtil(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

String ct = request.getContentType();

this.request = request;

this.response = response;

if (ct == null) {

this.isMultipartForm = false;

} else {

if (ct.indexOf(HttpUtil.MULTI_TYPE) < 0) {

this.isMultipartForm = false;

} else {

this.initMultipartForm(request, response);

this.isMultipartForm = true;

}

}

}

private byte[] copyBytes(byte[] src, int start, int end) {

byte[] ret = new byte[end - start + 1]; // include the end

for (int i = start; i <= end; i++)

ret[i - start] = src[i];

return ret;

}

private int countMatchs(byte[] src, byte[] find) {

int count = 0;

int pos = 0;

for (int i = 0; i < src.length - find.length + 1; i++) {

pos = this.findBytes(src, find, i);

if (pos >= 0) {

i = pos + find.length;

count++;

} else {

break;

}

}

return count;

}

/**

* <pre>

* download the special file

* </pre>

* @param filepath

* @throws IOException

*/

public void download(String filepath) throws IOException {

String filename = this.getFileName(filepath);

filename = new String(filename.getBytes("EUC-jp"), "EUC-jp");

File file = new File(filepath);

response.reset();

response.setContentType("application/octet-stream; charset=shift-jis");

response.addHeader("Content-Disposition", "attachment; filename=" + filename);

response.setContentLength((int) file.length());

byte[] buffer = new byte[4096];

BufferedOutputStream output = new BufferedOutputStream(response.getOutputStream());

BufferedInputStream input = new BufferedInputStream(new FileInputStream(file));

int n = -1;

while ((n = input.read(buffer, 0, 4096)) > -1) {

output.write(buffer, 0, n);

}

response.flushBuffer();

if (input != null)

input.close();

if (output != null)

output.close();

}

private int findBytes(byte[] src, byte[] find, int start) {

int ret = -1;

boolean match = true;

for (int i = start; i < src.length - find.length + 1; i++) {

match = true;

for (int j = 0; j < find.length; j++) {

if (src[i + j] != find[j]) {

match = false;

break;

}

}

if (match) {

ret = i;

break;

}

}

return ret;

}

/**

* <pre>

* get file's content(byte)

* </pre>

* @param paramName

* @return

*/

public byte[] getBytes(String paramName) {

if (!this.isMultipartForm)

return new byte[0];

byte[] ret;

int idx = this.getParamindex(paramName);

if (idx >= 0) {

ret = this.data[idx];

} else {

ret = new byte[0];

}

return ret;

}

/**

* <pre>

* getContentDisposition

* </pre>

* @param paramName

* @return

*/

public String getContentDisposition(String paramName){

if (!this.isMultipartForm)

return "";

String ret = "";

int idx = this.getParamindex(paramName);

if (idx >= 0) {

ret = this.contentDisposition[idx];

}

return ret;

}

/**

* <pre>

* getContentType

* </pre>

* @param paramName

* @return

*/

public String getContentType(String paramName){

if (!this.isMultipartForm)

return "";

String ret = "";

int idx = this.getParamindex(paramName);

if (idx >= 0) {

ret = this.contentType[idx];

}

return ret;

}

// Get field info

private void getFieldInfo(byte[] content, int startIndex, byte[] sep, int idx) throws UnsupportedEncodingException {

int p1, p2;

p1 = this.findBytes(content, HttpUtil.CRLF2, startIndex) + 4;

if (p1 < 4)

return;

p2 = this.findBytes(content, sep, p1) - 3;

if (p2 < p1){

this.data[idx] = new byte[0];

}else{

this.data[idx] = this.copyBytes(content, p1, p2);

}

this.fieldString[idx] = new String(this.copyBytes(content, startIndex, p1 - 5));

this.contentDisposition[idx] = this.getHeaderInfo(this.fieldString[idx], "Content-Disposition: ", ";", "/r/n");

this.name[idx] = this.getHeaderInfo(this.fieldString[idx], "name=/"", "/"", "/r/n");

this.filename[idx] = getFileName(this.getHeaderInfo(this.fieldString[idx], "filename=/"", "/"", "/r/n"));

this.contentType[idx] = this.getHeaderInfo(this.fieldString[idx], "Content-Type: ", ";", "/r/n");

if (this.filename[idx].length() == 0) {

this.value[idx] = new String(this.data[idx]);

} else {

this.value[idx] = "";

}

return;

}

/**

* <pre>

* getFile

* </pre>

* @param paramName

* @return

*/

public String getFile(String paramName) {

if (!this.isMultipartForm)

return "";

String ret = "";

int idx = this.getParamindex(paramName);

if (idx >= 0) {

ret = this.filename[idx];

}

return ret;

}

private String getFileName(String path) {

int p = -1;

p = path.lastIndexOf("//");

if (p < 0)

p = path.lastIndexOf("/");

if (p < 0)

return "";

return path.substring(p + 1);

}

private String getHeaderInfo(String header, String prefix, String suffix, String suffix2) {

int p1, p2;

p1 = header.indexOf(prefix) + prefix.length();

if (p1 < prefix.length())

return "";

p2 = header.indexOf(suffix, p1);

if (p2 < 0 && suffix2.length() > 0)

p2 = header.indexOf(suffix2, p1);

if (p2 < 0)

return "";

return header.substring(p1, p2);

}

/**

* <pre>

* getParameter

* </pre>

* @param paramName

* @return

*/

public String getParameter(String paramName) {

if (!this.isMultipartForm)

return this.request.getParameter(paramName);

String ret = "";

int idx = this.getParamindex(paramName);

if (idx >= 0) {

ret = this.value[idx];

}

return ret;

}

// get the parameter's index

public int getParamindex(String paramName) {

int ret = -1;

for (int i = 0; i < this.paramCount; i++) {

if (this.name[i].equals(paramName)) {

ret = i;

break;

}

}

return ret;

}

public String getParamName(int idx){

if(idx < this.paramCount){

return this.name[idx];

}

return "";

}

private void initMultipartForm(HttpServletRequest request, HttpServletResponse response) throws ServletException,

IOException {

// get all request data

int iTotalByte;

int iTotalRead;

int iReadByte;

iTotalByte = request.getContentLength();

iTotalRead = 0;

iReadByte = 0;

byte[] Buffer = new byte[iTotalByte];

if (iTotalByte == 0)

return;

// read all data

for (; iTotalRead < iTotalByte; iTotalRead += iReadByte) {

iReadByte = request.getInputStream().read(Buffer, iTotalRead, iTotalByte - iTotalRead);

}

// Find the seperate string

byte[] sepString = this.copyBytes(Buffer, 0, this.findBytes(Buffer, HttpUtil.CRLF, 0) + 1);

this.paramCount = this.countMatchs(Buffer, sepString);

this.fieldString = new String[this.paramCount];

this.filename = new String[this.paramCount];

this.name = new String[this.paramCount];

this.contentDisposition = new String[this.paramCount];

this.contentType = new String[this.paramCount];

this.data = new byte[this.paramCount][];

this.value = new String[this.paramCount];

int pos = 0;

for (int i = 0; i < this.paramCount; i++) {

this.getFieldInfo(Buffer, pos, sepString, i);

// find next position

pos = this.findBytes(Buffer, sepString, pos + sepString.length);

if (pos < 0)

break;

}

}

/**

* <pre>

* isMultipart

* </pre>

* @return

*/

public boolean isMultipart() {

return this.isMultipartForm;

}

/**

* <pre>

* get the field count

* </pre>

* @return

*/

public int size() {

return this.paramCount;

}

/**

* <pre>

* save file in templet

* </pre>

* @param paramName

* @return

* @throws IOException

*/

public String upload(String paramName) throws IOException {

if (!this.isMultipartForm)

return "";

String fileName = "";

int idx = this.getParamindex(paramName);

String prefix = "";

String suffix = "";

if (idx >= 0) {

if (this.filename[idx].length() != 0) {

int dotPos = this.filename[idx].indexOf('.');

if (dotPos >= 0) {

prefix = "tmp" + this.filename[idx].substring(0, dotPos);

if (dotPos > this.filename[idx].length() - 1) {

suffix = "";

} else {

suffix = this.filename[idx].substring(dotPos + 1);

}

} else {

prefix = "tmp" + this.filename[idx];

suffix = "";

}

File f = File.createTempFile(prefix, suffix);

fileName = f.getPath();

FileOutputStream fos = new FileOutputStream(f);

fos.write(this.data[idx]);

fos.close();

}

}

return fileName;

}

/**

* <pre>

* save file in special path

* </pre>

* @param paramName

* @param directory

* @return

* @throws IOException

*/

public String upload(String paramName, String directory) throws IOException {

if (!this.isMultipartForm)

return "";

String fileName = "";

int idx = this.getParamindex(paramName);

if (idx >= 0) {

if (this.filename[idx].length() != 0) {

File f = new File(directory, this.filename[idx]);

fileName = f.getPath();

FileOutputStream fos = new FileOutputStream(f);

fos.write(this.data[idx]);

fos.close();

}

}

return fileName;

}

 

本文地址:http://www.45fan.com/a/question/71442.html
Tags: 文件 上传 Java
编辑:路饭网
关于我们 | 联系我们 | 友情链接 | 网站地图 | Sitemap | App | 返回顶部