最近在作文件上传,小文件到无所谓,可是一般情况下都是大文件所以经常会出outofmemory,自己写了个小程序,目前可以多线程上传,也可以通过c++客户端和c#客户端上传,附件里的程序是c++和c#的,大概想法就是把大文件切分成小文件每次上传2M直到文件结束,也可以扩展下支持断点续传
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.fileupload.servlet.ServletRequestContext;
import org.apache.commons.fileupload.FileUpload;
import org.apache.commons.fileupload.RequestContext;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.servlet.ServletException;
import javax.servlet.ServletContext;
import javax.servlet.ServletInputStream;
import java.io.*;
import java.util.*;
import java.net.URLDecoder;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
/**
* 服务器端
*/
public class UploadCFileServlet extends HttpServlet {
private Map map = null;
public void init() throws ServletException
{
super.init();
try {
map = new HashMap();
} catch (Exception e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
}
public void destroy()
{
super.destroy();
try {
if(map != null)
{
map.clear();
}
} catch (Exception e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
String reqSessionId = request.getHeader("Cookie");
// System.out.println("reqSessionId = "+reqSessionId);
String FileEnd = request.getHeader("FileEnd");
// System.out.println("FileEnd = "+FileEnd);
//true uploadfile is end ,false go on upload
boolean isEnd = false;
response.setContentType("text/html");
PrintWriter out = response.getWriter();
File newFile = null;
try {
String path = this.getServletContext().getRealPath("/");
request.setCharacterEncoding("UTF-8");
RequestContext requestContext = new ServletRequestContext(request);
if (FileUpload.isMultipartContent(requestContext)) {
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setRepository(new File(path));
// factory.setSizeThreshold(8096);
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setSizeMax(100*1024*1024);
List items = new ArrayList();
try {
items = upload.parseRequest(request);
} catch (FileUploadException e1) {
System.out.println("文件上传发生错误" + e1.getMessage());
}
Iterator it = items.iterator();
while (it.hasNext()) {
FileItem fileItem = (FileItem) it.next();
if (!fileItem.isFormField()) {
String fileName = URLDecoder.decode(fileItem.getName(), "utf-8");
System.out.println(fileItem.getFieldName() + " " + fileName + " " +fileItem.isInMemory() + " " +fileItem.getContentType() + " " +fileItem.getSize());
if (fileItem.getName() != null && fileItem.getSize() != 0) {
File fullFile = new File(fileName);
newFile = new File(path+"/sharefolder/" + fullFile.getName());
// if the file exists and the sessionid is also exists so add the file
if(reqSessionId !=null &&isExists(reqSessionId))
{
InputStream is = fileItem.getInputStream();
int length = is.available();
System.out.println("filitem length ="+length);
byte[] buffer = new byte[length];
is.read(buffer,0,length);
RandomAccessFile raf = new RandomAccessFile(newFile, "rw");
long fileLength = Long.valueOf(newFile.length()).longValue();
System.out.println("fileLength ="+fileLength);
raf.seek(fileLength);
raf.write(buffer);
raf.close();
is.close();
// if true uploadfile is end ,false go on upload
isEnd = Boolean.valueOf(FileEnd).booleanValue();
if(isEnd)
{
removeSessionId(reqSessionId);
}
}
// a new file is upload
else
{
try {
fileItem.write(newFile);
// if true uploadfile is end ,false go on upload
isEnd = Boolean.valueOf(FileEnd).booleanValue();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
}
out.println("200");
if(!isEnd)
{
if(reqSessionId == null)
{
HttpSession hs = request.getSession();
reqSessionId = hs.getId();
}
map.put(reqSessionId,newFile);
response.addHeader("Cookie",reqSessionId);
}
} catch (IOException e) {
out.println("400");
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
} finally {
}
}
public boolean isExists(String sessionId)
{
if(map.get(sessionId) != null)
{
return true;
}
return false;
}
public void removeSessionId(String sessionId)
{
System.out.println("remove sessionId="+sessionId);
map.remove(sessionId);
System.out.println("map size="+map.size());
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
this.doPost(request,response);
}
}
//客户端
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.Map;
import java.util.Set;
public class testupload {
public static void main(String[] args) throws Exception {
HttpURLConnection conn = null;
BufferedReader br = null;
DataOutputStream dos = null;
DataInputStream inStream = null;
InputStream is = null;
OutputStream os = null;
boolean ret = false;
String StrMessage = "";
String exsistingFileName = "d:\\jdk150.ZH_cn.chm";
//String exsistingFileName ="e:\\[IBM.Lotus.Domino-Notes.7.0.1简体中文版全集].Lotus_Domino_Server_7.0.1_zh-CN_Windows.zip";
String lineEnd = "\r\n";
String twoHyphens = "--";
String boundary = "*****";
int bytesRead, bytesAvailable, bufferSize, start;
byte[] buffer;
int maxBufferSize = 1 * 1024 * 1024;
String responseFromServer = "";
String urlString = "http://192.168.1.12/UploadCFileServlet";
String Cookie = null;
String FileEnd = null;
System.out.println("=====================================");
try {
//------------------ CLIENT REQUEST
long start1 = System.currentTimeMillis();
long end1 = 0;
FileInputStream fileInputStream = new FileInputStream(new File(
exsistingFileName));
bytesAvailable = fileInputStream.available();
System.out.println("bytesAvailable ===" + bytesAvailable);
bufferSize = 2 * 1024 * 1024;
buffer = new byte[bufferSize];
// read file and write it into form...
start = 0;
// bytesRead = fileInputStream.read(buffer, 0, bufferSize);
int i = 0;
boolean flag = true;
while (flag) {
if (bytesAvailable > 0) {
int newAvailable = fileInputStream.available();
if (newAvailable < bufferSize) {
bufferSize = newAvailable;
buffer = new byte[bufferSize];
flag = false;
FileEnd = "true";
}
System.out.println("new available = " + newAvailable);
bytesAvailable = fileInputStream
.read(buffer, 0, bufferSize);
System.out.println("bytesRead ===" + bytesAvailable);
}
// open a URL connection to the Servlet
URL url = new URL(urlString);
// Open a HTTP connection to the URL
conn = (HttpURLConnection) url.openConnection();
// Allow Inputs
conn.setDoInput(true);
// Allow Outputs
conn.setDoOutput(true);
// Don't use a cached copy.
conn.setUseCaches(false);
// Use a post method.
conn.setRequestMethod("POST");
conn.setRequestProperty("Connection", "Keep-Alive");
conn.setRequestProperty("Content-Type",
"multipart/form-data;boundary=" + boundary);
if (Cookie != null)
conn.setRequestProperty("Cookie", Cookie);
if (FileEnd != null)
conn.setRequestProperty("FileEnd", FileEnd);
dos = new DataOutputStream(conn.getOutputStream());
dos.writeBytes(twoHyphens + boundary + lineEnd);
dos
.writeBytes("Content-Disposition: form-data; name=\"uploadfile\";"
+ " filename=\""
+ URLEncoder.encode(exsistingFileName, "utf-8")
+ "\"" + lineEnd);
dos.writeBytes(lineEnd);
// String str1 = new String(buffer);
// System.out.println("str1 ="+str1);
int length = buffer.length;
System.out.println("length =" + length);
dos.write(buffer, 0, bufferSize);
// send multipart form data necesssary after file data...
dos.writeBytes(lineEnd);
dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
// close streams
dos.flush();
dos.close();
//------------------ read the SERVER RESPONSE
try {
inStream = new DataInputStream(conn.getInputStream());
Map headers = conn.getHeaderFields();
Set keys = headers.keySet();
for (String key : keys) {
String val = conn.getHeaderField(key);
System.out.println(key + " " + val);
if (key != null && key.equalsIgnoreCase("Cookie")) {
Cookie = val;
}
}
String str;
while ((str = inStream.readLine()) != null) {
System.out.println("Server response is: " + str);
System.out.println("");
}
inStream.close();
} catch (IOException ioex) {
System.out.println("From (ServerResponse): " + ioex);
}
System.out.println("=====================================");
}
fileInputStream.close();
end1 = System.currentTimeMillis();
System.out.println("upload times" + ((end1 - start1) / 1000)
+ " seconds.");
} catch (MalformedURLException ex) {
System.out.println("From ServletCom CLIENT REQUEST:" + ex);
} catch (IOException ioe) {
System.out.println("From ServletCom CLIENT REQUEST:" + ioe);
}
}
}
分享到:
相关推荐
包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用...
包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用...
2. **antlr-2.7.6.jar**: 用于创建解析器和编译器的开源库,支持多种编程语言,如Java、C#和C++。它提供了一种机制来定义语法规则,并自动生成相应的解析器代码。 3. **cglib-nodep-2.1_3.jar**: CGLIB是一个代码...
DAB变换器双向运行模型:单重移相控制策略与切换过程电压幅度研究,DAB变器双向运行模型。 单重移相控制 不少伙伴咨询DAB怎么改反向运行。 特意搭建了这个双向运行的DAB模型。 可实现正反向的不间断运行,是一个集成在一起的模型。 如展示图所示,图中0.3s处改变了功率传输的方向。 如果想研究切过程电压幅度的问题,可看我另一个关于DAB控制的方法 ~ ,DAB变换器; 双向运行模型; 移相控制; 功率传输方向切换; 电压幅度。,DAB变换器双向运行模型:单重移相控制与电压幅度切换过程研究
掼蛋平台使用说明书1006 (1).pdf
"密歇根大学燃料电池系统Matlab Simulink模型:电堆、压缩机拟合及辅助模块的全面构建与解析",密歇根大学质子交膜燃料电池系统模型,matlab simulink模型 包含: 电堆模型。 压缩机拟合模型。 理想加湿器、冷却器模型。 阳极、阴极流道模型。 进排气总管模型。 包含模型1:1搭建过程文件。 每一个模块都有搭建过程,都有说明文件,中文wrod版。 附赠参考文。 ,关键词: 密歇根大学; 质子交换膜燃料电池系统模型; MATLAB Simulink模型; 电堆模型; 压缩机拟合模型; 理想加湿器、冷却器模型; 阳极、阴极流道模型; 进排气总管模型; 搭建过程文件; 说明文件; 附赠参考文。,"密歇根大学燃料电池系统模型:Matlab Simulink电堆与辅助组件模型集"
免费JAVA毕业设计 2024成品源码+论文+录屏+启动教程 启动教程:https://www.bilibili.com/video/BV1SzbFe7EGZ 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
1、文件内容:perl-DBD-MySQL-4.023-6.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/perl-DBD-MySQL-4.023-6.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装
ollama基础知识简介.md
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
YD-T 4961.3-2024 隐私计算 跨平台互联互通 第3部分:互联协议.pdf
资源说明: 1:csdn平台资源详情页的文档预览若发现'异常',属平台多文档切片混合解析和叠加展示风格,请放心使用。 2:29页图文详解文档(从零开始项目全套环境工具安装搭建调试运行部署,保姆级图文详解),旨在为更多的人甚至零基础的人也能运行、使用和学习。 3:配套毕业论文,万字长文,word文档,支持二次编辑。 4:配套答辩ppt,pptx格式,支持二次编辑。 5:工具环境、ppt参考模板、相关电子教程、视频教学资源分享。 6:资源项目源码均已通过严格测试验证,保证能够正常运行,本项目仅用作交流学习参考,请切勿用于商业用途。 7:项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通。 内容概要: 本系统基于B/S网络结构,在IDEA中开发。服务端用Java并借Spring Boot框架搭建后台。前台采用支持HTML5的VUE框架。用MySQL存储数据,可靠性强。 能学到什么: 使用Spring Boot搭建后台。VUE框架构建前端交互界面、前后端数据交互、MySQL管理数据、从零开始环境搭建、调试、运行、打包、部署流程。
eLab
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
CST超表面仿真技术在近场成像与全息案例应用中的实践与探索,cst超表面仿真 近场成像与全息案例 ,核心关键词: 1. CST超表面仿真; 2. 近场成像; 3. 全息案例。,CST超表面仿真与近场成像全息案例
1、文件内容:perl-Module-Runtime-0.013-4.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/perl-Module-Runtime-0.013-4.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装