上传文件到服务器例子,包括前端后台一整套

首先从前端开始:
uploadFile.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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=UTF-8">
<title>Insert title here</title>
</head>
<script src="js/jquery-1.12.0.min.js"></script>
<script src="js/jquery.form.js"></script>
<body>
	<form id="upfile">
		选择一个文件:
		<input type="file" name="file" id="upload" />
		<br/><br/>
		<input id="uploadFile" value="上传" type="button"/>
	</form>
	
	<div id="upFile"></div>
</body>
<script type="text/javascript">

$("#uploadFile").click(function(){
	var formData = new FormData($("#upfile")[0]);
	//formData.set('file', document.getElementById("upload").files[0]);
	$.ajax({
        url: '${pageContext.request.contextPath}/uploadFile/upload',
        type: 'POST',
        cache: false,
        data: formData,
        processData: false,
        contentType: false
    }).done(function(res) {
        
    });
});
</script>
</html>
上面那个js中注掉的那行,是 直接定位到file那个标签,但是set方法在低版本的浏览器上不支持,会报错只供参考,注意file标签必须是在form里面,记得不能嵌套form,只能有一个form;一般form都是<form method="post" action="" enctype="multipart/form-data" id="upfile"></form>;我上面例子只是精简了;

前端完成后到后端:
先配置一些参数:
congif.properties(设置上传文件的大小和服务器地址):
#upload
upload.file.maxsize = 104857600
upload.file.url=http://192.168.102.11/test
pom.xml需要引入的jar包

                 <dependency>
			<groupId>commons-fileupload</groupId>
			<artifactId>commons-fileupload</artifactId>
			<version>1.3.2</version>
		</dependency>
		<dependency>
			<groupId>com.google.guava</groupId>
			<artifactId>guava</artifactId>
			<version>18.0</version>
		</dependency>
		<dependency>
		    <groupId>commons-httpclient</groupId>
		    <artifactId>commons-httpclient</artifactId>
		    <version>3.1</version>
		</dependency>
		<dependency>
		    <groupId>org.apache.maven.wagon</groupId>
		    <artifactId>wagon-webdav-jackrabbit</artifactId>
		    <version>2.4</version>
		</dependency>
		<dependency>
			<groupId>slide</groupId>
			<artifactId>slide-webdavlib</artifactId>
			<version>2.1</version>
		</dependency>




spring配置中需要加下面配置:
<!-- 引入配置文件中的参数 -->
	<context:property-placeholder location="classpath:config.properties" />
	<!-- 配置MultipartResolver 用于文件上传 使用spring的CommosMultipartResolver -->
	<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<property name="defaultEncoding" value="UTF-8"></property>
		<property name="maxUploadSize" value="50485760"></property>
		<property name="resolveLazily" value="true"></property>
	</bean>

	<!-- 对传入的url进行一些处理,这个<span style="font-family: Arial, Helvetica, sans-serif;">UploadFileUtils类所在路径需要根据你实际放置到项目的路径一致,这个类我下面提供了,建完这个类后别忘记把class中的路径替换掉</span>-->
	<bean class="com.yoho.common.UploadFileUtils">
		<property name="downloadUrl" value="${upload.file.url}"/>
	</bean>
UploadFileUtils.java(这个类主要是对config中的url参数的一些处理)
import org.apache.commons.lang3.StringUtils;



public class UploadFileUtils {

	public static String downloadUrl = null;

    /**
     * 绝对路径与相对路径转换
     */
    public static String addPrefix(String url) {
        // 本身就是绝对路径直接返回
        if (url == null || url.startsWith("http://") || url.startsWith("https://")) {
            return url;
        }
        return URLUtils.append(downloadUrl, url);
    }

    public static String removePrefix(String url) {
        // 如果 url 不符合条件,直接返回
        if (url == null || !url.startsWith(downloadUrl)) {
            return url;
        }
        return StringUtils.removeStart(url, downloadUrl);
    }

    public void setDownloadUrl(String downloadUrl) {
        UploadFileUtils.downloadUrl = downloadUrl;
    }
}
controller接收请求:
UploadFile.java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import com.yoho.model.FileInfo;
import com.yoho.service.UploadService;

/**
 * @author zelei.fan
 *
 */
@Controller
@RequestMapping("/uploadFile")
public class UploadFile{

	@Autowired
	private UploadService uploadService;
	/**
	 * 需要在spring-mvc中配置MultipartFile相关信息,以及引进fileUpload的依赖
	 * @param multipartFile
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value = "/upload", method = RequestMethod.POST)
	@ResponseBody
	public FileInfo upload(@RequestParam("file")MultipartFile multipartFile)throws Exception{
		
		FileInfo fileInfo = uploadService.uploadFile(multipartFile);
		return fileInfo;
	}
	
}
实体类,封装了一些属性,文件名,文件类型,相对地址,绝对地址
FileInfo.java
public class FileInfo {

	private String fileName;

    private String fileType;

    private String absoluteUrl;

    private String relativeUrl;

    private String fileSize;

    private String fileMd5;

    private String createAt;

	public String getFileName() {
		return fileName;
	}

	public void setFileName(String fileName) {
		this.fileName = fileName;
	}

	public String getFileType() {
		return fileType;
	}

	public void setFileType(String fileType) {
		this.fileType = fileType;
	}

	public String getAbsoluteUrl() {
		return absoluteUrl;
	}

	public void setAbsoluteUrl(String absoluteUrl) {
		this.absoluteUrl = absoluteUrl;
	}

	public String getRelativeUrl() {
		return relativeUrl;
	}

	public void setRelativeUrl(String relativeUrl) {
		this.relativeUrl = relativeUrl;
	}

	public String getFileSize() {
		return fileSize;
	}

	public void setFileSize(String fileSize) {
		this.fileSize = fileSize;
	}

	public String getFileMd5() {
		return fileMd5;
	}

	public void setFileMd5(String fileMd5) {
		this.fileMd5 = fileMd5;
	}

	public String getCreateAt() {
		return createAt;
	}

	public void setCreateAt(String createAt) {
		this.createAt = createAt;
	}
    
    
}

然后到service中进行业务处理:
UploadService.java(业务处理接口)
import org.springframework.web.multipart.MultipartFile;

import com.yoho.model.FileInfo;

public interface UploadService {

	/**
	 * 上传文件,返回链接
	 * @param multipartFile
	 * @return
	 */
	FileInfo uploadFile(MultipartFile multipartFile);

}

具体的实现类:
UploadServiceImpl.java
import static com.google.common.base.Preconditions.checkArgument;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.StringTokenizer;
import org.apache.commons.httpclient.HttpURL;
import org.apache.webdav.lib.WebdavResource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import com.google.common.collect.Iterators;
import com.google.common.collect.Lists;
import com.google.common.collect.PeekingIterator;
import com.yoho.common.DateUtil;
import com.yoho.common.MD5;
import com.yoho.model.FileInfo;
import com.yoho.service.UploadService;

/**
 * 
 * @author zelei.fan
 *
 */
@Service
public class UploadServiceImpl implements UploadService{
	
	@Value("${upload.file.url}")
    private String uploadUrl;

    @Value("webdav")
    private String uploadUsername;

    @Value("webdav")
    public String uploadPassword;
	
	@Override
	public FileInfo uploadFile(MultipartFile multipartFile) {
		
		//取到文件大小,如果超过指定范围的话就直接返回提醒错误
        long size = multipartFile.getSize();
        //获取文件名
        String fileName = multipartFile.getOriginalFilename();
        // 获取文件后缀,即文件类型
        String fileExt = "";
        if (fileName.contains(".")) {
            fileExt = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
        }
        //设置MD5加密
        String fileMD5 = md5File(multipartFile);

        //拼接文件路径:/后缀/年/月/日/md5/filename
        String saveUrl = "/" + fileExt + new SimpleDateFormat("/yyyy/MM/dd/").format(new Date()) + fileMD5 + "/" + multipartFile.getOriginalFilename();

        String location = null;
		try {
			location = saveFile(multipartFile, saveUrl);//保存文件操作
		} catch (Exception e) {
			e.printStackTrace();
		}

        FileInfo fileInfo = new FileInfo();
        fileInfo.setAbsoluteUrl(location);
        fileInfo.setRelativeUrl(saveUrl);
        fileInfo.setFileMd5(fileMD5);
        fileInfo.setFileName(fileName);
        fileInfo.setFileSize(String.valueOf(size));
        fileInfo.setFileType(fileExt);
        fileInfo.setCreateAt(DateUtil.date2String(new Date(), DateUtil.DATE_TIME_FORMAT));
        return fileInfo;

	}
	
	//MD5加密
	private String md5File(MultipartFile multipartFile) {
        try {
            return MD5.md5(multipartFile.getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
	
	
	
	private String saveFile(MultipartFile file, String savePath) throws Exception {
        // 上传文件,到文件服务器,uploadUrl是在config中配好的,就是给uploadUrl赋值,如果不用那么麻烦的话可以直接把url放进去:upload("http://192.168.102.11/test", uploadUsername, uploadPassword, savePath, file.getBytes());
    	upload(uploadUrl, uploadUsername/*那台服务器的用户名*/, uploadPassword/*那台服务器的密码*/, savePath, file.getBytes());
        return append(uploadUrl, savePath);
        
    }
	
	
	public static void upload(String webDavServer, String webDavUser, String webDavPassword, String remotePath, byte[] bytes) throws IOException {

		if (!webDavServer.endsWith("/")) webDavServer += "/";
		
		//连接服务器
		HttpURL hrl = new HttpURL(webDavServer);
		hrl.setUserinfo(webDavUser, webDavPassword);

		WebdavResource wdr =  new WebdavResource(hrl);

		//make directory if need
		StringBuffer ssdir = new StringBuffer();
		// 去除最后一个文件名
		StringTokenizer t = new StringTokenizer(remotePath.substring(0, remotePath.lastIndexOf("/")), "/");
		while(t.hasMoreTokens()){
			String sdir = t.nextToken();
			ssdir.append(sdir+"/");
			wdr.mkcolMethod(wdr.getPath() + ssdir );
		}

		String remoteFile= wdr.getPath() + remotePath;//拼成绝对地址
		boolean result = wdr.putMethod(remoteFile, bytes);//把文件写进去
		checkArgument(result, "文件上传出错");//false时会报错,true则为成功

		wdr.close();//最后关闭连接

	}
	
	
	
    /**
     * 连接 URL
     * @param paths
     * @return
     */
    public static String append(String... paths) {
        List<String> pathList = Lists.newArrayList(paths);
        PeekingIterator<String> iter = Iterators.peekingIterator(pathList.iterator());
        StringBuilder urlBuilder = new StringBuilder();
        while (iter.hasNext()) {
            String current = iter.next();
            urlBuilder.append(current);
            if (!iter.hasNext()) {
                break;
            }
            if (current.endsWith("/") && iter.peek().startsWith("/")) {
                urlBuilder.deleteCharAt(urlBuilder.length() - 1);
            } else if (!current.endsWith("/") && !iter.peek().startsWith("/")) {
                urlBuilder.append("/");
            }
        }
        return urlBuilder.toString();
    }

}
所有的代码都已经在上面了,我已经测试过能上传成功,相应方法的注释页标在上面,希望你能运行成功;如果有什么问题可以留言给我,尽量能帮到你


  • 4
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
### 回答1: 可以使用以下代码在前端使用JavaScript上传文件服务器: ```javascript // 获取 input[type="file"] 元素 const input = document.querySelector('input[type="file"]'); // 监听 input[type="file"] 元素的 change 事件 input.addEventListener('change', () => { // 创建 FormData 对象 const formData = new FormData(); // 将文件添加到 FormData 对象中 const file = input.files[0]; formData.append('file', file); // 发送 POST 请求到服务器 fetch('/upload', { method: 'POST', body: formData }) .then(response => { console.log('上传成功!'); }) .catch(error => { console.error('上传失败:', error); }); }); ``` 以上代码中,首先获取 input[type="file"] 元素,并监听其 change 事件。在事件处理程序中,创建 FormData 对象,并将文件添加到 FormData 对象中。然后使用 fetch 函数发送 POST 请求到服务器,并将 FormData 对象作为请求体发送。最后在 then 方法中处理上传成功的情况,在 catch 方法中处理上传失败的情况。 ### 回答2: 对于前端上传文件服务器的代码,用JavaScript实现通常需要以下步骤: 1. 首先,需要在HTML页面上创建一个文件选择的input元素,以便用户选择要上传的文件。例如: ```html <input type="file" id="fileInput"> ``` 2. 在JavaScript代码中,获取到file input的元素,并添加一个事件监听器以便在用户选择文件后执行上传操作。例如: ```javascript const fileInput = document.getElementById('fileInput'); fileInput.addEventListener('change', handleFileUpload); ``` 3. 在事件处理函数中,获取用户选择的文件,然后使用FormData对象创建一个表单数据,以便将文件数据传递给服务器。例如: ```javascript function handleFileUpload(event) { const file = event.target.files[0]; const formData = new FormData(); formData.append('file', file); // 进行上传操作 uploadFile(formData); } ``` 4. 最后,使用XMLHttpRequest或fetch API发送文件上传请求到服务器。例如: ```javascript function uploadFile(formData) { const xhr = new XMLHttpRequest(); xhr.open('POST', '/upload', true); xhr.send(formData); xhr.onload = function() { if (xhr.status === 200) { console.log('文件上传成功'); } else { console.error('文件上传失败'); } }; } ``` 在上述代码中,`/upload`是服务器文件上传请求的URL,可以根据具体的后端实现进行修改。 以上是一个基本的前端上传文件服务器的代码实现。当用户选择文件并点击上传按钮时,会将文件数据发送给服务器端,并在上传成功或失败时给予相应提示。 ### 回答3: 下面是一个使用 JavaScript 编写的前端上传文件服务器的代码示例: 首先,需要在 HTML 页面中创建一个文件上传的表单,可以使用<input type="file">元素来实现: ```html <form id="uploadForm"> <input type="file" id="fileInput"> <button type="button" onclick="uploadFile()">上传</button> </form> ``` 然后,我们需要编写 JavaScript 函数来处理文件上传操作。在这个函数中,我们需要获取用户选择的文件,并使用AJAX将文件发送到服务器: ```javascript function uploadFile() { let fileInput = document.getElementById('fileInput'); let file = fileInput.files[0]; // 获取选中的文件 let formData = new FormData(); // 创建一个FormData对象 formData.append('file', file); // 将文件添加到FormData对象中 let xhr = new XMLHttpRequest(); // 创建一个XMLHttpRequest对象 xhr.open('POST', '/upload', true); // 设置请求的方法和URL xhr.onload = function() { if (xhr.status === 200) { console.log('文件上传成功'); } else { console.log('文件上传失败'); } }; xhr.send(formData); // 发送FormData对象到服务器 } ``` 在服务器端,你需要提供一个收文件的路由。这个路由可以是一个后端口(如使用Node.js + Express),或者一个框架自带的处理文件上传的路由(如Django中的`<form>`表单)。 以上是一个使用 JavaScript 编写的前端上传文件服务器的代码。你可以根据自己的需求对其进行修改和扩展。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值