实现用户头像上传

步骤分析,

先导入包,
然后,在前端jsp页面创建form表单,更改enctype=“multipart/form-data”.要上传的头像文件类型为,file。
再,在跳转的servlet中用,创建三行语句,接收到输入流数据,解析,放入list中。
接着判断,文件向是否是普通文件项,是则直接放入map集合。不是,则是文件项需要用流写出。
,最后,用文件项,获取读入流,创建文件写出流。用ioutils,直接实现输入输出流的对接。

jsp页面实现代码

    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
	<form action=" testServlet" method="post" enctype="multipart/form-data">
		账号:<input type="text" name="username"></br>
		密码:<input type="password" name="password"></br>
		头像:<input type="file" name="head"></br>
		<button>提交数据</button>
	</form>
</body>
</html>

servlet代码实现


import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.IOUtils;
public class testServlet extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		/*String username = request.getParameter("username");
		String password = request.getParameter("password");
		String head=request.getParameter("head");
		System.out.println(username);
		System.out.println(password);
		System.out.println(head);
		传统方式获取不到form表单的ectype类型为:multipart/form-data的数据,因为这些数据已经不是键值对的形式传输了
		而是通过流的形式进行传输
		InputStream stream = request.getInputStream();
		int i=stream.read();
		while(i!=-1) {
			char c=(char)i;
			System.out.print(c);
			i=stream.read();
		}*/
		
		try {
			//一下三行代码的三行代码的作用request.getInputStream();获取请求体的全部内容
			//进行解析,获得分割线的内容,将其封装在FileItem对象中
			DiskFileItemFactory dff=new DiskFileItemFactory();
			ServletFileUpload sfu=new ServletFileUpload(dff);
			List<FileItem> list = sfu.parseRequest(request);
			//创建map集合,键存名字,值存值。
			Map<String ,String> map=new HashMap<String,String>();
			
			for (FileItem fi : list) {
				//判断该项是否是普通项
				if(fi.isFormField()) {
					/*System.out.println(fi.getFieldName());//username  password    
					System.out.println(fi.getName());	 //null		  null
					System.out.println(fi.getString());	 //aaa		  aa*/
					map.put(fi.getFieldName(), fi.getString("UTF-8"));
				}else {
					//该项是文件项
					//获取文件项输入流,放入输入流对象
					InputStream is = fi.getInputStream();
					//获取要存入的文件夹的绝对路径
					String path = request.getSession().getServletContext().getRealPath("/aaa/aaa/");//文件路径
					//创建文件,(路径,文件名12312.jpg)
					File file=new File(path,fi.getName());
					//判断文件是否已经存在,不存在就创建一次;
					if(!file.exists()) {
						file.createNewFile();
					}
					//将文件项放到输出流对象内
					OutputStream os=new FileOutputStream(file);
					//用工具,实现,输入输出流的对接
					IOUtils.copy(is, os);
					//释放资源
					IOUtils.closeQuietly(is);
					IOUtils.closeQuietly(os);
					//存放键值对
					map.put(fi.getFieldName(),"/aaa/aaa/"+fi.getFieldName());
				}
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
	}

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

}
  • 1
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Qt中实现QQ头像上传和下载功能,通常会用到其跨平台的网络通信库QNetworkAccessManager和文件操作相关的模块如 QFile 或 QDir。这里是一个简单的步骤概述: 1. **设置用户界面**: 创建一个UI元素,比如一个按钮用于选择图片,显示进度条等。 2. **图片选择**: 使用QFileDialog让用户从本地选择图片作为上传内容。例如,`QFileDialog::getOpenFileName()` 可以获取所选文件名。 3. **读取图片数据**: 使用 QFile 类打开并读取选取的图片文件,将其转化为字节流(QByteArray)。 ```cpp QFile file(filePath); if (file.open(QIODevice::ReadOnly)) { QByteArray imageData = file.readAll(); } ``` 4. **上传接口调用**: 使用 QNetworkAccessManager 发起POST请求上传图片数据。创建一个自定义的QNetworkRequest,并设置URL、headers和数据内容。例如: ```cpp QNetworkRequest request(url); request.setRawHeader("Content-Type", "image/jpeg"); QByteArray postData = ...; // 将 imageData base64编码后填入 QNetworkReply *reply = manager.post(request, postData); connect(reply, &QNetworkReply::finished, this, &YourClass::uploadFinished); ``` 5. **接收服务器响应**: 在 uploadFinished 信号连接的槽函数里处理服务器返回的状态码和可能的数据。 6. **下载接口调用**: 对于下载,可以监听下载完成的信号(比如 finished 或 readyRead),然后将接收到的内容写入本地文件: ```cpp QNetworkReply *downloadReply = manager.get(requestUrl); connect(downloadReply, &QNetworkReply::readyRead, this, &YourClass::downloadReadyRead); void downloadReadyRead() { QByteArray data = downloadReply->readAll(); QFile saveFile("path/to/save.jpg"); if (saveFile.open(QIODevice::WriteOnly)) { saveFile.write(data); } } ``` 注意:上述代码只是一个简化版示例,实际开发中可能需要处理更多异常情况,例如网络错误、权限问题等。此外,具体的API可能会因QQ服务而异,需要查看其文档或官方API才能准确调用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值