在设计丰富多彩的网站或业务逻辑丰富的程序的过程中,必然会有很多图片的相关操作,尤其是图片的上传。纸质办公室可能需要备份和上传纸质文件,网站建设可能需要上传用户头像、图片描述等,都需要将图片从本地上传到互联网(服务器)。
当业务需要时,机器会随着不断制作的照片上传到网站上,以便在网站上查看。
由于图片的处理比较新,我们打算一点一点的解决这些业务需求。一、业务分为以下几个部分:
1.服务器接收浏览器上传的图片。这很容易实现,因为大部分服务器端开发都是基于B/S架构,即逻辑和浏览器端开发。
2.服务器接收客户端上传的图片。这看起来可能不难,但是如何正确发送数据就有点难了,这也是今天笔者踩坑的地方。
3.业务逻辑的优化和完善。
1.新建一个网页
<! DOCTYPE html >
< html >
< head >
< meta charset ="UTF-8" >
< title >图片上传</ title >
</ head >
< body >
< formaction ="/plant / upload.action" enctype ="multipart/form-data"
方法="post" >
图片:type ="file" name ="img" /> <br /> 11 < input type = "submit" value ="upload" /> 12 </ form > 13 </ body > 14 </ html >
2.对Controller层进行编码
@Controller
public class UploadController {
@RequestMapping(value="/upload",method= RequestMethod.POST)
@ResponseBody
public String uploadImg(@RequestParam("img" ) MultipartFile img, HttpServletRequest request,HttpServletResponse response) {
字符串内容类型 = img.getContentType(); //获取文件类型
System.out.println("文件类型为:" + contentType);
字符串 originalFilename = img.getOriginalFilename(); //获取文件原名
//判断文件是否为空
if (! img.isEmpty()) {
File targetImg = new File("F:/img" );
//判断文件夹是否存在
if (! targetImg.exists()) {
targetImg.mkdirs(); //级联创建文件夹
}
try {
//开始保存图片
FileOutputStream outputStream = newFileOutputStream("F:/img/" + originalFilename);
输出流.write(img.getBytes());
输出流.flush();
输出流.close();
} catch (IOException e) {
e.printStackTrace();
}
}
返回“成功” ;
}
}
3.spring和依赖修改
<!-- 文件上传组件 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>${commons-fileupload.version}< /版本>
</依赖>
<!-- 支持文件上传 -->
<bean id="multipartResolver" class ="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 请求编码格式 -->
<属性名="defaultEncoding" value="utf-8"></property>
<!-- 上传文件大小(Company:byte) -->
<property name="maxUploadSize" value="50000000"></property>
<!-- 缓冲区大小(Company:KB) -->
<property name="maxInMemorySize" value="1024"></property>
</bean>
4.启动项目,打开浏览器显示对应图片上传网页,选择图片,点击上传。如果不走出本地路径,应该会看到刚刚上传的图片。
互联网上有很多内容。本部分介绍使用 HttpURLConnection 进行上传。第一种方法相对复杂。您需要手动封装请求并传播数十行代码。二是如果项目比较复杂,使用Session或者Cookie,没办法~
基于以上原因,本文选择使用HttpClient上传本地图片
1.引入相关依赖
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.3</version>
</dependency>
<dependency>
<groupId> org.apache.httpcomponents</groupId>
<artifactId>httpmime</artifactId>
<version>4.5.3</version>
</dependency>
2.编写客户端程序
导入java.io.BufferedReader;
导入java.io.File;
导入java.io.IOException;
导入java.io.InputStream;
导入java.io.InputStreamReader;
导入java.util.Arrays;
导入org.apache.commons.codec.binary.Base64;
导入org.apache.commons.lang3.StringUtils;
导入org.apache.http.HttpEntity;
导入org.apache.http.client.ClientProtocolException;
进口org.apache.http.client.methods.CloseableHttpResponse;
导入org.apache.http.client.methods.HttpPost;
导入org.apache.http.entity.ContentType;
导入org.apache.http.entity.mime.MultipartEntityBuilder;
导入org.apache.http.entity.mime.content.ByteArrayBody;
导入org.apache.http.entity.mime.content.FileBody;
导入org.apache.http.entity.mime.content.StringBody;
导入org.apache.http.impl.client.CloseableHttpClient;
导入org.apache.http.impl.client.HttpClients;
进口org.apache.http.util.EntityUtils;
public class ClientUpload {
public static void main(String[] args) throws ClientProtocolException, IOException, InterruptedException {
String url = "http://localhost:8090/plant/upload.action" ;
// 字符串 basePath = "F:\img\";
字符串路径 = "G:\123.jpg" ;
上传图片(网址,“dfsdfsdfsdf” ,路径);
}
公共 静态String uploadImage(String path, String base64String, String imageFilePath) throws ClientProtocolException, IOException {
// 1. 创建上传需要的元素类型
// 1.1 本地上传图片加载文件
File imageFile = new File(imageFilePath);
文件体图像文件体 =新文件体(图像文件);
// 1.2 加载过程base64编码的图片数据
// String imageBase64Data = base64String;
// ByteArrayBody byteArrayBody = null;
// if (StringUtils.isNotEmpty(imageBase64Data)) {
// byte[] byteImage = Base64.decodeBase64(imageBase64Data);
// byteArrayBody = new ByteArrayBody(byteImage, "image_name");
// }
// 1.3 上传对象的加载字符串
StringBody name = new StringBody("admin" , ContentType.TEXT_PLAIN);
// 2. 将要上传的所有元素打包到 HttpEntity 对象中
// HttpEntity reqEntity = MultipartEntityBuilder.create().addPart("name", name).addPart("img", imageFileBody).addPart("file2", byteArrayBody).build();
HttpEntity reqEntity = MultipartEntityBuilder.create().addPart("name", name).addPart("img" , imageFileBody).build();
// 3. 建立HttpPost 对象,包含信息传输post news
HttpPost httpPost = new HttpPost(path);
httpPost.setEntity(reqEntity);
// 4. 建立 HttpClient 对象,传入 httpPost 执行发送网络请求的动作
CloseableHttpClient httpClient =HttpClients.createDefault();
CloseableHttpResponse 响应 = httpClient.execute(httpPost);
// 5. 获取返回的实体内容对象并解析内容
HttpEntity resultEntity = response.getEntity();
字符串响应消息 = "" ;
try {
if (resultEntity != null ) {
InputStream is = resultEntity.getContent();
BufferedReader br = new BufferedReader( new InputStreamReader(is));
字符串缓冲区某人 =新字符串缓冲区();
字符串行 = "" ;
while ((line = br.readLine()) != null ) {
sb.append(line);
}
响应消息 = sb.toString();
System.out.println("响应内容为:" + responseMessage);
}
EntityUtils.consume(resultEntity);
}最后{
如果(空!=响应){
响应。关闭();
}
}
返回响应消息;
}
}
3.到目前为止,如果没有意外的话,应该可以在控制台看到令人兴奋的“SUCCESS”输出
1.由于图片是不断生成的,所以需要不断的上传图片,保证上传的图片不重复。
public static void main(String[] args) throws ClientProtocolException, IOException, InterruptedException {
String url = "http://localhost:8090/plant/upload.action" ;
字符串 basePath = "F:\img\" ;
// 字符串路径 = "G:\123.jpg";
// uploadImage(url, "dfsdfsdfsdf",path);
while ( true ) {
File file = new File(basePath);
字符串[] 列表 =文件列表();
Arrays.sort(list);
for (String str : list) {
//图片未标记为上传
if (!str.startsWith("Upload" )) {
uploadImage(url, "chao", basePath + str); //上传图片
new File(basePath + str).renameTo( new File(basePath + "Upload_" + str)); //重命名图片
}
}
Thread.sleep(1000*60); //等待 60 秒。
}
}
2.服务器的改进
如果想在开发的网站上能够浏览图片,一般业务比较小,可以直接发到Tomcat服务器,然后记录路径写入数据库;如果业务比较大,可以在本地设置图片服务器,可以通过Nginx或者其他技术实现,然后需要将路径写入数据库保存。
以上就是关于“Java上传图片到服务器的方法”介绍,大家如果想了解更多相关知识,不妨来关注一下动力节点的Java在线学习,里面的课程内容从入门到精通,很适合没有基础的小伙伴学习,希望对大家能够有所帮助。
你适合学Java吗?4大专业测评方法
代码逻辑 吸收能力 技术学习能力 综合素质
先测评确定适合在学习