首页 课程 师资 教程 报名

Java上传图片到服务器的方法

  • 2022-07-12 11:30:34
  • 1900次 动力节点

在设计丰富多彩的网站或业务逻辑丰富的程序的过程中,必然会有很多图片的相关操作,尤其是图片的上传。纸质办公室可能需要备份和上传纸质文件,网站建设可能需要上传用户头像、图片描述等,都需要将图片从本地上传到互联网(服务器)。

业务描述

当业务需要时,机器会随着不断制作的照片上传到网站上,以便在网站上查看。

解决方案

由于图片的处理比较新,我们打算一点一点的解决这些业务需求。一、业务分为以下几个部分:

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;  
 导入o​​rg.apache.commons.codec.binary.Base64;
 导入o​​rg.apache.commons.lang3.StringUtils;
 导入org.apache.http.HttpEntity;
 导入o​​rg.apache.http.client.ClientProtocolException;
 进口org.apache.http.client.methods.CloseableHttpResponse;
 导入org.apache.http.client.methods.HttpPost;
 导入o​​rg.apache.http.entity.ContentType;
 导入o​​rg.apache.http.entity.mime.MultipartEntityBuilder;
 导入o​​rg.apache.http.entity.mime.content.ByteArrayBody;
 导入o​​rg.apache.http.entity.mime.content.FileBody;
 导入o​​rg.apache.http.entity.mime.content.StringBody;
 导入o​​rg.apache.http.impl.client.CloseableHttpClient;
 导入o​​rg.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大专业测评方法

代码逻辑 吸收能力 技术学习能力 综合素质

先测评确定适合在学习

在线申请免费测试名额
价值1998元实验班免费学
姓名
手机
提交