JAVA Http 图片传输

学习笔记:MFC实现http协议传输图片和文本 要将自己的文件通过http协议进行上传到Web服务器,就必须进行数据封装,也就是加上http协议的包头,数据前加上数据信息描述,协议尾三部分,一边服务端进行解析。在我们本次项目中,我需要控制Ip摄像头进行拍照,将抓取的图片通过Http协议传送到另一个人负责的服务器端。我用的的是MFC,完成控制客户端开发。 阅读详情

话不多说,直接上代码

发送端:

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLDecoder;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import javax.activation.MimetypesFileTypeMap;

import org.apache.commons.io.output.ByteArrayOutputStream;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.entity.mime.content.ByteArrayBody;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
 
public class upLoadImg {    
    /**
     * 测试上传png图片
     *
     */
    public static void testUploadImage(){
         String url = "http://9ycegd4a.dongtaiyuming.net";
        String fileName = "C:\\HWKJ\\UploadImg\\test.jpg";
        Map<String, String> textMap = new HashMap<String, String>();
        //普通参数:可以设置多个input的name,value
/*        textMap.put("name", "testname");
        textMap.put("type", "2");*/
        //文件:设置file的name,路径
        Map<String, String> fileMap = new HashMap<String, String>();
        fileMap.put("file", fileName);
        String contentType = "";//image/png
         formUpload(url, textMap, fileMap,contentType);
    }
 
 
    /**
     * 上传图片
     * @param urlStr
     * @param textMap
     * @param fileMap
     * @param contentType 没有传入文件类型默认采用application/octet-stream
     * contentType非空采用filename匹配默认的图片类型
     * @return 返回response数据
     */
    @SuppressWarnings("rawtypes")
    public static String formUpload(String urlStr, Map<String, String> textMap,
           Map<String, String> fileMap,String contentType) {
        System.out.println("开始发送");
        String res = "";
        HttpURLConnection conn = null;
        // boundary就是request头和上传文件内容的分隔符
        String BOUNDARY = "---------------------------123821742118716";
        try {
            URL url = new URL(urlStr);
            conn = (HttpURLConnection) url.openConnection();
            conn.setConnectTimeout(5000);
            conn.setReadTimeout(30000);
            conn.setDoOutput(true);
            conn.setDoInput(true);
            conn.setUseCaches(false);
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Connection", "Keep-Alive");
            conn.setRequestProperty("User-Agent",
                    "Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.6)");
            conn.setRequestProperty("Content-Type",
                    "multipart/form-data; boundary=" + BOUNDARY);
            OutputStream out = new DataOutputStream(conn.getOutputStream());
            // text
            if (textMap != null) {
                StringBuffer strBuf = new StringBuffer();
                Iterator iter = textMap.entrySet().iterator();
                while (iter.hasNext()) {
                    Map.Entry entry = (Map.Entry) iter.next();
                    String inputName = (String) entry.getKey();
                    System.out.println("传入名称:"+inputName);
                    String inputValue = (String) entry.getValue();
                    if (inputValue == null) {
                        continue;
                    }
                    strBuf.append("\r\n").append("--").append(BOUNDARY)
                            .append("\r\n");
                    strBuf.append("Content-Disposition: form-data; name=\""
                            + inputName + "\"\r\n\r\n");
                    strBuf.append(inputValue);
                    System.out.println(inputName+","+inputValue);
                }
                out.write(strBuf.toString().getBytes());
            }
            // file
            if (fileMap != null) {
                Iterator iter = fileMap.entrySet().iterator();
                while (iter.hasNext()) {
                    Map.Entry entry = (Map.Entry) iter.next();
                    String inputName = (String) entry.getKey();
                    String inputValue = (String) entry.getValue();
                    if (inputValue == null) {
                        continue;
                    }
                    File file = new File(inputValue);
                    String filename = file.getName();
                    
                    //没有传入文件类型,同时根据文件获取不到类型,默认采用application/octet-stream
                    contentType = new MimetypesFileTypeMap().getContentType(file);
                    //contentType非空采用filename匹配默认的图片类型
                    if(!"".equals(contentType)){
                        if (filename.endsWith(".png")) {
                            contentType = "image/png";
                        }else if (filename.endsWith(".jpg") || filename.endsWith(".jpeg") || filename.endsWith(".jpe")) {
                            contentType = "image/jpeg";
                        }else if (filename.endsWith(".gif")) {
                            contentType = "image/gif";
                        }else if (filename.endsWith(".ico")) {
                            contentType = "image/image/x-icon";
                        }
                    }
                    if (contentType == null || "".equals(contentType)) {
                        contentType = "application/octet-stream";
                    }
                    StringBuffer strBuf = new StringBuffer();
                    strBuf.append("\r\n").append("--").append(BOUNDARY)
                            .append("\r\n");
                    strBuf.append("Content-Disposition: form-data; name=\""
                            + inputName + "\"; filename=\"" + filename
                            + "\"\r\n");
                    System.out.println(inputName+","+filename);
                    
                    strBuf.append("Content-Type:" + contentType + "\r\n\r\n");
                    out.write(strBuf.toString().getBytes());
                    DataInputStream in = new DataInputStream(
                            new FileInputStream(file));
                    int bytes = 0;
                    byte[] bufferOut = new byte[1024];
                    while ((bytes = in.read(bufferOut)) != -1) {
                        out.write(bufferOut, 0, bytes);
                    }
                    in.close();
                }
            }
            byte[] endData = ("\r\n--" + BOUNDARY + "--\r\n").getBytes();
            out.write(endData);
            out.flush();
            out.close();
            // 读取返回数据
            StringBuffer strBuf = new StringBuffer();
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    conn.getInputStream()));
            String line = null;
            while ((line = reader.readLine()) != null) {
                strBuf.append(line).append("\n");
            }
            res = strBuf.toString();
            System.out.println("响应数据:"+res);
            reader.close();
            reader = null;
        } catch (Exception e) {
            System.out.println("发送POST请求出错。" + urlStr);
            e.printStackTrace();
        } finally {
            if (conn != null) {
                conn.disconnect();
                conn = null;
            }
        }
        return res;
    }
    
    public static void main(String[] args) {
        testUploadImage();
    }
}

Java接收端:

public FileResult upload(@RequestParam("picture") MultipartFile picture, HttpServletRequest request) throws ParseException {

    System.out.println("您已进入图片上传服务");
    //获取文件在服务器的储存位置
    String path = "C:/workspace/img";
    File filePath = new File(path);
    System.out.println("文件的保存路径:" + path);
    if (!filePath.exists() && !filePath.isDirectory()) {
        System.out.println("目录不存在,创建目录:" + filePath);
        filePath.mkdir();
    }

    //获取原始文件名称(包含格式)
    String originalFileName = picture.getOriginalFilename();
    System.out.println("原始文件名称:" + originalFileName);

    //获取文件类型,以最后一个`.`为标识
    String type = originalFileName.substring(originalFileName.lastIndexOf(".") + 1);
    System.out.println("文件类型:" + type);
    //获取文件名称(不包含格式)
    String name = originalFileName.substring(0, originalFileName.lastIndexOf("."));
    DateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    Date date = simpleDateFormat.parse("2020-04-28 02:33:29");

    long ts = date.getTime();

    System.out.println(ts);

    String res = String.valueOf(ts);  // 转化为字符串

    String fileName = res + name + "." + type;
    System.out.println("新文件名称:" + fileName);

    //在指定路径下创建一个文件
    File targetFile = new File(path, fileName);
    System.out.println("图片地址:"+path+"/"+fileName);
    //将文件保存到服务器指定位置
    try {
        picture.transferTo(targetFile);
        System.out.println("上传成功");
        //将文件在服务器的存储路径返回
        return new FileResult(true,fileName,path+"/"+fileName);
    } catch (IOException e) {
        System.out.println("上传失败");
        e.printStackTrace();
        return new FileResult(false, "上传失败","");
    }
}

 

安时积分法和开路电压法结合估算锂电池SOC 基于安时积分法和开路电压法结合的锂电池SOC估计Simulink仿真建模,利用安时积分法计算放电过程中的SOC,在搁置状态利用开路电压法进行SOC修正。 阅读详情

相关推荐

鸿蒙进阶——HDI及IDL硬件接口IPC框架小结

HDI(Hardware Device Interface):OpenHarmony硬件设备接口,定义系统中跨进程通信的接口,实现服务间的跨进程通信

最美不过,心中有梦,身旁有你! 3905

java httpClient上传图片

RDB简介 RDB是Redis默认用来进行持久化的一种方式,是把当前内存中的数据集以快照的方式写入到磁盘中并生成一个.rdb文件,文件默认叫做dump.rdb,并且是redis默认的持久化机制。恢复数据时也是通过解析dump.rdb中的数据到内存中。 持久化触发条件 RDB持久化的触发分为手动触发和自动触发两种。 1)手动触发 save命令会阻塞Redis服务器进程,直到RDB文件创建完毕为止,在Redis服务器阻塞期间,服务器不能处理任何命令请求。(基本已废弃,效率太慢) bgsave命令会创建一个子进

旅人的博客 1768

转录组数据提取技巧汇总

数据整理是数据分析的前提,而数据的正确提取则是数据整理的前提。

zfyyzhys的博客 1784

java http图片上传,JAVA模拟HTTP post请求上传图片

1.原理:实现思路和具体步骤就是模拟页面的请求/*** @author qimh* @description 模拟form表单,上传图片* @param fileName -- 图片路径* @return 接口返回的json数据* 原理:模拟form表单提交:把请求头部信息和和img 信息 写入到输出流中,* 通过流把img写入到服务器临时目录里,然后服务器再把img移到指定的位置* 最后通过写入...

weixin_39669629的博客 719

智能座舱语音测试避坑指南:从唤醒率到方言识别,这些场景你测全了吗?

本文深入解析智能座舱语音测试的关键场景与避坑指南,涵盖唤醒率测试、方言识别、多音区交互等复杂场景。通过实战案例与自动化测试方案,帮助开发者全面提升语音系统的可靠性与用户体验,特别关注环境噪声干扰与方言覆盖策略。

weixin_42613501的博客 497

WPS用户看过来:避开格式错乱坑,用WPS Office完美制作红头文件(2024最新版)

本文详细解析了WPS Office与Word在红头文件制作中的核心差异,提供了2024年最新版的零误差实战指南。从字体处理、页面布局到红头制作关键步骤,帮助用户避开格式错乱坑,确保跨设备显示一致。特别针对WPS用户优化,解决字体丢失、版式错位等常见问题。

weixin_26800111的博客 218

【JAVA上传图片到服务器实现远程访问---3种方法】

JAVA上传图片到服务器 今天自己做项目,遇到一个图片上传的功能。一开始我以为很简单,只要前端input拿到本地图片的地址后存到数据库,然后再渲染出来就ok了,尝试后才发现真的是自己想多了hahaha。 上面的想法存在几个问题: 1、拿不到本地的图片地址。input选择图片上传后,浏览器打开页面检查发现地址是http://localhost:xxxxxxxxxx,此时这个地址复制到浏览器打开是可以访问的,但是刚刚那个前端页面关闭后,这个地址就不可以访问了,也找了很多资料为什么拿不到本地图片的路径,基本上的说

lth_0418的博客 1万+

FoundationPose复现及Realsense应用

FoundationPose是一个统一的基础模型,用于6D对象姿态估计和跟踪,支持基于模型和无模型的设置。在测试时可以立即应用于未见过的新对象,无需微调,只要给出其CAD模型,或者捕获少量RGBD参考图像。得益于统一框架,下游姿态估计模块在两种3D模型设置中都是相同的,当没有CAD模型时,使用神经隐式表示进行高效的新视角合成。通过大规模合成训练,辅以大型语言模型(LLM)、一种基于transformer的新架构和对比学习公式,实现了强大的泛化能力。

m0_56661101的博客 1万+

JAVA发送HTTP请求(GET和POST),请求图片数据

import com.actionsoft.bpms.util.UUIDGener; import net.sf.json.JSONObject; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.client.HttpClient; import org.a...

就牙白 5591

034、MLCA 多尺度局部上下文注意力的 YOLOv11 适配:轻量级金字塔式空间上下文聚合

本文介绍了一种将多尺度局部上下文注意力(MLCA)模块集成到YOLOv11模型中的方法,以解决小目标检测中空间信息丢失的问题。MLCA采用金字塔式局部上下文聚合策略,通过不重叠的网格划分实现轻量级空间注意力计算,相比全局注意力机制能更好地保留小目标特征。 作者详细记录了实现过程,包括模块定义、参数调优和训练技巧,特别指出避免使用BN而改用GroupNorm以提升训练稳定性。在VisDrone数据集上的实验表明,MLCA-YOLOv11在参数量和计算量基本不变的情况下,mAP提升2.5%,其中行人检测提升3.

sundong_81的博客 280

【异常】OpenClaw报错 400 Total tokens of image and text exceed max message tokens. Request

OpenClaw报错400(Token超限)解决方案摘要 该报错因文本/图片总Token数超过模型限额导致,常见于多轮对话累积或单次请求过大。提供三级解决方案: 应急处理:输入"/new"指令清空会话历史,立即重置Token计数(90%问题可解决) 折中方案:保留历史对话前提下,通过精简当前输入、删除早期无关对话或拆分请求来压缩Token 专属处理:单次请求超限时,拆分长文本为2000字以内段落,或分批次上传降低分辨率图片 长期预防建议定期使用"/new"开启新会话,

奶爸的编程之路,也就一周冷个三天 1391

java http post图片

java http post图片文件,参考文章https://blog.youkuaiyun.com/yjclsx/article/details/70675057 /** * 上传文件到指定地址URL * * @param fileName 文件名 * @param urlStr 上传地址 * @return */ public st...

Antman的博客 1836

把 LangGraph 当“工作流引擎”用:与传统 BPM 的差异与融合策略

首先,我们来回顾一下有限状态机(FSM)的基本定义——一个 FSM 可以用一个五元组MQΣδq0FMQΣδq0​FQQQ有限状态集合,包含 FSM 所有可能的状态;Σ\SigmaΣ有限输入字母表,包含 FSM 所有可能的输入;δ\deltaδ状态转移函数,定义了 FSM 从当前状态q∈Qq \in Qq∈Q接收输入σ∈Σσ∈Σ后,转移到的下一个状态q′∈Qq' \in Qq′∈Q,即δQ×Σ→QδQ×Σ→Q。

AI 原生应用开发的博客 227

python和java Http传输图片的简单实现

需要将python检测的图片上传到java客户端,这里是一个简单的实现: Java服务器: @RequestMapping("/upload") @ResponseBody public String handleFileUpload(@RequestParam("image_file") MultipartFile file) { if (!file.isEmpty()) { try { /*

m0_55505998的博客 2477

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

J2ME中通过Http协议传输图片

        曾经在优快云看到多位网友问图片传输的问题,因此决定写篇文章讲述一个问题,最后通过实例演示如何解决这个问题并提供源代码。如果你对联网中的操作以及多线程还不熟悉那么请参考本站如下文章。    <A title="文章标题:编写高效友好的多线程J2ME联网应用作 者:mingjava更新时间:2004-9-7 9:21:38点击次数:59" href="http://

mingjava的专栏 4620

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

java传输什么格式图片到前端好

在 Java 后端中传输图片到前端时,使用 Base64 编码格式传输是比较常见和高效的做法。这种方式将图片转换为字符串形式,再通过 HTTP 协议传输到前端,前端可以使用 JavaScript 将其解码并显示图片。 ...

weixin_42602368的博客 462

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

将图片转为base64编码的几种Java代码写法

将图片转为base64编码的几种Java代码写法

qq_39691492的博客 1538

java-web开发图片的处理

BASE图片传输的问题,图片转为BASE64,BASE64转为图片,图片传输的问题

qq_43471945的博客 323

通过Response向浏览器输出图片

package com.itheima.content; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServlet; import javax.ser.

dxm809的博客 910

Http request传输图片和附属信息(old)

在MeToo的研发过程中,部分模块需要使用http请求向服务器同时传输图片和一些附属信息。由于图片使用NSDATA格式传输,附属信息使用JSON格式传输,而消息的body只能支持其中一种格式,因此在只要传输JSON信息的时候,使用UTF8编码传输;在需要同时传输图片和附属信息时,将图片以二进制格式放在body里,附属信息的JSON放在header里,如下所示: [[SVHTTPClient sh

大米瓶子的博客 2296

java实现图片与byte相互转换

java代码:import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream;public class TestImage { public static void main(String[] args) throws Exception { //

松松面包的博客 1万+

java接口通信协议_常见通信协议

常见通信协议应用层:HTTP(hypertext transfer protocol ):超文本传输协议FTP(File Transfer Protocol):文件传输协议SFTP(SSH File Transfer Protocol):安全文件传送协议DNS(domain name system):域名系统SMTP(simple mail transfer protocol): 简单邮件传输协议...

weixin_34416909的博客 3814

前端处理java后端使用流文件传输方式显示图片

业务场景 摈弃第三方图片存储,后端使用java语言开发,图片相关操作使用ftp的流文件传输方式,前端无法使用传统显示图片的方式来显示,需要对返回数据流进行编码处理; 整体思路 定义请求返回的数据流为二进制类型——对返回数据进行Uint8Array编码——使用String.fromCharCode()方法将Uint8编码的数组元素进行字符转化——使用数组的reduce方法累加数组元素拼凑成字符长串—...

weixin_44243056的博客 2965

模拟HTTP请求

一、HTTP协议的基础知识        服务器端返回数据的三种主要方式:HTML, XML, JSON, 二、方式:Get和Post. 三、特点: 1、Get : (1)将键值对放在URL后面传递(URL?key=value&key=value的形式)        (2)服务器端直接读取,效率高,用Request.QueryString获取变量的值        (3)缺乏安全性

u013561988的专栏 517

在Android上通过模拟HTTP multipart/form-data请求协议信息实现图片上传

通过构造基于HTTP 协议的传输内容实现图片自动上传到服务器功能 。如果自己编码构造HTTP 协议,那么编写的代码质量肯定不高,建议模仿HttpClient .zip examples \mime\ClientMultipartFormPost.java 来实现,并通过源码来进一步理解如何优雅高效地构造HTTP 协议传输内容。   自己构造HTTP 协议传输内容的想法,从何而来呢?灵感启迪于这

chuchu521的专栏 2234

java开发客户端软件_java开发的zimg客户端

packagecom.guttv.common.utils;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.InputStream;im...

weixin_29195137的博客 390
上一篇: Vue + Spring Boot + Shiro 跨域解决(开发+生产)
下一篇: SpringBoot + Spring Cloud +Vue 管理系统前端搭建(三、工具模块封装)
Java程序之猿
博客等级 码龄9年 2599粉丝 140原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值