利用js实现文件上传

第一次写博客,也不知怎么去写,这次也算是一个开头吧。之前也一直关注别人写的博客,他们写的挺好,我从中也收获不少。

首先,对于编程,我并非科班出身。我本科学的是统计学,其实更确切的说是学数学的,因为我们大部分的课程是被数学占满了。可能有些人会奇怪,统计学干嘛学那么数学。因为我学的是数理统计,学校很深厚的数学功底,也因为这样我才会转行做软件的。这次我分享的是用js实现文件上传的功能,首先说明一下,此技术并非都是我原创,我是阿发你好课程的基础上改编的,他原创的没有图片预览的功能,我在他的基础上增加图片预览的功能。顺便给发哥打一下广告,他的课程真心不错,我在他那里学到很多原理上的东西,这是他的官方网址http://afanihao.cn/我只负责推荐,学不学看你自己。

好了废话不多说了,直接上代码吧,所有思路代码都有注释。

一、前端HTML部分

<div class='main'>
			<input type='file' class='filebutton' style='display:none' οnchange='fileSelected()'  /> <br>
			<button class="upload" οnclick='openFileDialog()' > 选择文件上传 </button>
			<div class="img">
			
			</div>
	   </div>

二、js部分

 //点击普通按钮,打开文件选择框
	    function openFileDialog()
	    {
	    	$(".filebutton").click();
	    }
	    //选择一个文件时onchange时间被触发
	    function fileSelected()
	    {
	    	var fbutton = $(".filebutton")[0];//dom元素
	    	//读取文件
	    	var reader = new FileReader();
	    	reader.onload = function(e)
	    	{
	    		var dataURL = e.target.result;//'data:image/jpeg;base64,/9j/4AAQSk...(base64编码)...'   
	    		//alert(data);
	    		var htmlImg = "<img src = '" + dataURL + "'/>";
		    	$(".img").html(htmlImg);
	    	}
	    	var file = fbutton.files[0];
	    	reader.readAsDataURL(file);
	    	
	    	startFileUpload(file);	    	
	    }
	    //开始上传
	    function startFileUpload(file)
	    {
	    	var uploadURL = "FileUploadServer";
	    	
	    	//手工构造一个form对象
	    	var formData = new FormData();
	    	formData.append("file" , file);// 'file' 为HTTP Post里的字段名, file 对浏览器里的File对象
	    	//手工构造一个请求对象,用这个对象发送表单数据
	    	//设置 progress, load, error, abort 4个事件处理器
	    	var request = new XMLHttpRequest();
	    	request.upload.addEventListener("progress" , window.evt_upload_progress , false);
		    request.addEventListener("load", window.evt_upload_complete, false);
		    request.addEventListener("error", window.evt_upload_failed, false);
		    request.addEventListener("abort", window.evt_upload_cancel, false);			
			request.open("POST", uploadURL ); // 设置服务URL
		    request.send(formData);  // 发送表单数据
	    }
	    window.evt_upload_progress = function(evt)
	    {
	    	if(evt.lengthComputable)
	    	{
	    		
	    		var progress = Math.round(evt.loaded * 100 / evt.total);
	    		console.log("上传进度" + progress);
	    	}
	    };
		window.evt_upload_complete = function (evt)
		{
			if(evt.loaded == 0)
			{
				console.log ("上传失败!");
			}
			else
			{
				console.log ("上传完成!");
		    	var response = JSON.parse(evt.target.responseText);
		    	console.log (response);
			}			
		};		 
		window.evt_upload_failed = function (evt) 
		{			
			console.log  ("上传出错"); 
		};
		window.evt_upload_cancel = function (evt) 
		{
			console.log( "上传中止!");	
		};

三、后端部分,需要两个jar包的支持,他们分别是:commons-fileupload-1.3.1.jar   commons-io-2.4.jar

package my.fileUpload;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

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

import org.apache.commons.fileupload.FileItemIterator;
import org.apache.commons.fileupload.FileItemStream;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.fileupload.util.Streams;
import org.json.JSONObject;

public class FileUploadServer extends HttpServlet {

	File tmpDir;//文件保存的临时目录
	
	@Override
	public void init() throws ServletException {
		System.out.println("初始化");
	   File webRoot = new File(getServletContext().getRealPath("/"));
	   tmpDir = new File(webRoot , "upload");
	   if(!tmpDir.exists()) tmpDir.mkdirs();
	}

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doPost(request , response);

	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		System.out.println("进入");
		int error = 0;
		String reason = "OK";
		String data = null;
		try {
			 data = doUpload(request , response);
		} catch (Exception e) {
			error = -1;
			reason = e.getMessage();
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		JSONObject jreq = new JSONObject();
		jreq.put("error", error);
		jreq.put("reason", reason);
		if(data != null) jreq.put("data", data);
		response.setCharacterEncoding("utf-8");
		response.setContentType("text/plain");
		PrintWriter out = response.getWriter();
		out.write(jreq.toString(2));

	}
	
	private String doUpload(HttpServletRequest request, HttpServletResponse response) throws Exception
	{
		String result = null;
		boolean isMultipart = ServletFileUpload.isMultipartContent(request);
		if(!isMultipart)
			throw new Exception("请求编码必须为: multipart/form-data !");
		request.setCharacterEncoding("utf-8");
		ServletFileUpload upload = new ServletFileUpload();
		FileItemIterator iter = upload.getItemIterator(request);
		while(iter.hasNext())
		{
			//表单域
			FileItemStream item = iter.next();
			String fieldName = item.getFieldName();
			InputStream fieldStream = item.openStream();
			if(item.isFormField())
			{
				//普通表单域直接读取
				String fieldValue = Streams.asString(fieldStream , "utf-8");
				System.out.println("表单域:" + fieldName + "=" + fieldValue);				
			}
			else
			{
				String realName = item.getName();//原始文件名
				//文件的后缀名
				String suffix = realName.substring(realName.lastIndexOf(".")+1);
				System.out.println("文件名:" + realName + "....." + "后缀名:" + suffix);
				
				//创建已个临时文件名
				String s = UUID.randomUUID().toString();
				String s2 = s.substring(0,8)+s.substring(9,13)+s.substring(14,18)+s.substring(19,23)+s.substring(24); 
				s2 = s2.toUpperCase();
				SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd-HHmmss");
				String dateStr = sdf.format(new Date());
				String fileName = dateStr +"-" + s2 + "." + suffix;
				result = fileName;
				System.out.println("文件名:" + fileName);
				File file = new File(tmpDir , fileName);
				long fileSsize = 0;//文件大小
				System.out.println("===========文件开始上传=============");
				//从FieldStream读取数据,保存到目标文件
				file.getParentFile().mkdirs();
				FileOutputStream fileStream = new FileOutputStream(file);
				try
				{
					byte[] buf = new byte[1024];
					while(true)
					{
						int n = fieldStream.read(buf);
						if(n < 0) break;
						if(n == 0) continue;
						fileStream.write(buf, 0, n);
						
						fileSsize += n;
					}
				}finally
				{
					fileStream.close();
					fieldStream.close();
				}
				System.out.println("上传完成!");
				
				
			}
		}
		return result;
	}

}

最后再说一下,代码会很多需要改进的地方,欢迎各位同僚给出意见,谢谢!

  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AndyWei147

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值