HttpURLConnection上传文件(图片)小试-程序员宅基地

技术标签: java  数据库  

需求:用HttpURLConnection模拟上传图片并把图片的名称也要传递过去.

简单分析:写入流的时候依次写入 图片名称 + "|" 分隔符 +  图片流

然后服务器接收的再处理流.分别取出图片名和图片.

/** */ /**
     * 上传方法
     * 返回上传完毕的文件名
     * *
     
*/

    
public  String upload(File f)
    
{
        
try
        
{
            
//服务器IP(这里是从属性文件中读取出来的)
            String hostip = FileSupport.getServerIP();
            URL url 
= new URL("http://"+ hostip +"/oxServer/ReceiveServlet");
            
            HttpURLConnection uc 
= (HttpURLConnection) url.openConnection();
            
//上传图片的一些参数设置
            uc
                    .setRequestProperty(
                            
"Accept",
                            
"image/gif,   image/x-xbitmap,   image/jpeg,   image/pjpeg,   application/vnd.ms-excel,   application/vnd.ms-powerpoint,   application/msword,   application/x-shockwave-flash,   application/x-quickviewplus,   */*");
            uc.setRequestProperty(
"Accept-Language""zh-cn");
            uc
                    .setRequestProperty(
"Content-type",
                            
"multipart/form-data;   boundary=---------------------------7d318fd100112");
            uc.setRequestProperty(
"Accept-Encoding""gzip,   deflate");
            uc
                    .setRequestProperty(
"User-Agent",
                            
"Mozilla/4.0   (compatible;   MSIE   6.0;   Windows   NT   5.1)");
            uc.setRequestProperty(
"Connection""Keep-Alive");
            uc.setDoOutput(
true);
            uc.setUseCaches(
true);
        
            
//读取文件流
            int size = (int) f.length();
            
byte[] data = new byte[size];
            FileInputStream fis 
= new FileInputStream(f);
            OutputStream out 
= uc.getOutputStream();
            fis.read(data, 
0, size);
            
//写入文件名
            out.write(f.getName().trim().getBytes());
            
//写入分隔符
            out.write('|');
            
//写入图片流
            out.write(data);
            out.flush();
            out.close();
            fis.close();
            
            
//读取响应数据
            int code = uc.getResponseCode();
            String sCurrentLine 
= "";
            
//存放响应结果
            String sTotalString = "";
            
if (code == 200)
            
{
                java.io.InputStream is 
= uc.getInputStream();
                BufferedReader reader 
= new BufferedReader(
                        
new InputStreamReader(is));
                
while ((sCurrentLine = reader.readLine()) != null)
                    
if (sCurrentLine.length() > 0)
                        sTotalString 
= sTotalString + sCurrentLine.trim();
            }

            
else
            
{
                sTotalString 
= "远程服务器连接失败,错误代码:" + code;
            }

            
return sTotalString;
        }

        
catch (Exception e)
        
{
            e.printStackTrace();
        }

        
return null;
    }


服务器Servlet:
public   void  doGet(HttpServletRequest request, HttpServletResponse response)
            
throws  ServletException, IOException
    
{
        ServletInputStream inStream 
= request.getInputStream(); // 取HTTP请求流
        int size = request.getContentLength(); // 取HTTP请求流长度

        
byte[] buffer = new byte[size]; // 用于缓存每次读取的数据
        byte[] result = new byte[size]; // 用于存放结果的数组
        int count = 0;
        
int rbyte = 0;
        
// 循环读取
        while (count < size)
        
{
            rbyte 
= inStream.read(buffer); // 每次实际读取长度存于rbyte中 sflj
            for (int i = 0; i < rbyte; i++)
            
{
                result[count 
+ i] = buffer[i];
            }

            count 
+= rbyte;
        }


        
// 先找到文件名和图片流的标志位'|'
        int index = 0;
        
for (int i = 0; i < result.length; i++)
        
{
            
byte b = result[i];
            
if (b == '|')
            
{
                index 
= i;
                
break;
            }

        }


        
// 存放文件名
        byte name[] = new byte[index + 1];
        
// 存放图片字节
        byte[] img = new byte[size - index];
        
for (int i = 0; i < result.length; i++)
        
{
            
if (i < index)
            
{
                name[i] 
= result[i];
            }

            
if (i > index)
            
{
                
// 这时注意img数组的index要从0开始
                img[i - index - 1= result[i];
            }

        }

        
// 还原文件名
        String fileName = new String(name);

        inStream.close();

        String newFileName 
= renameFile(fileName);
        
// 响应客户端
        response.setContentType("text/html");
        
// 注意响应中文数据时要设置
        response.setCharacterEncoding("GBK");
        PrintWriter out 
= response.getWriter();
        
//可能情况 0 数据库无相关记录 1 文件名不符合要求 其它情况为正常
        if(newFileName.equals("0"))
        
{
            out.write(
"0|" + fileName);
        }

        
else if(newFileName.equals("1"))
        
{
            out.write(
"1|" + fileName);
        }

        
else
        
{
            out.write(fileName);
        }

        out.close();
        
//上传错误中止后续操作
        if(newFileName.length()<= 1)
        
{
            
return;
        }

        
        File f 
= new File(ImageSupport.getOriginal() + "/" + newFileName);
        FileOutputStream fos 
= new FileOutputStream(f);
        fos.write(img);
        fos.flush();
        fos.close();
        
// 改变图片大小后重新放置到新地点
        ImageSupport.changeImageSize(f, ImageSupport.getAfter() + "/"
                
+ newFileName, 300300);
    }


我写的是一个批量上传图片的程序,经测试通过.
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/shy7778/article/details/83336631

智能推荐

java练习 二、判断语句 if--else语句_输入一个整数,如果此数为0,则输出”石头”,如果此数为1,则输出”剪刀”-程序员宅基地

文章浏览阅读2.5k次。1)接java练习 一、HelloWorld,地址:http://blog.csdn.net/u013871927/article/details/700576152)在src文件夹内创建IfPractice.java文件3)打开IfPractice.java,在里面编辑以下代码:public class IfPractice{public String practice(int_输入一个整数,如果此数为0,则输出”石头”,如果此数为1,则输出”剪刀”

报错:Data truncated for column 'parent_id' at row1 -程序员宅基地

文章浏览阅读1.5w次。如果在运行系统.sql脚本文件时报:Data truncated for column 'parent_id' at row1 错误。 主要原因是在建表的列为特定类型,而所插入的数据类型没与其字段一一对应。 比如本来建表中字段一个int类型的,而你在insert表时有个字段写成了string类型,则就报此错误了。

SAP 消息 有关成本控制范围 XXXX的控制标志不存在_有关成本控制范围的控制标志不存在-程序员宅基地

文章浏览阅读3.5k次。此错误问题解决路径如下:点开后编辑:再去做凭证发现错误消除了。_有关成本控制范围的控制标志不存在

IT运维的365天--009微信双开批处理文件运行出错(当前目录无效)的解决_微信多开bat找不到文件-程序员宅基地

文章浏览阅读848次。微信双开批处理,文件编码格式,ANSI_微信多开bat找不到文件

python 协程库gevent学习 -- 超时、互斥锁(BoundedSemaphore)、local_python gevent.lock-程序员宅基地

文章浏览阅读3.8k次。当其他greenlet去访问它的时候是无法访问到的,它只在自己的greenlet的命名空间中有效。这里Mylocal继承了gevent的local,这里重点介绍一下__slots__在这里的用法,我们知道在常规的类里面指定__slots__的意思往往是只允许该类下的属性只允许有__slots__里面这些,超出的就会报出Attribute error的错误。但是继承了local的__slots__在这里却是指,申明了的属性将会穿透所有greenlet变成一个全局可读的,并不再是线程本地的,这里注意下。_python gevent.lock

【nginx】如何解决使用nginx作为反向代理端口耗尽问题?_连接数过多导致nginx服务器端口数不足-程序员宅基地

文章浏览阅读2.4k次。TCP 长连接负载均衡问题(10W 用户) ----- TCP 长连接 ----- Nginx/HAproxy/LVS(软件负载) ------ TCP 长连接 ----- (实际业务,多台业务服务器)客户端 TCP 10W 长连接到 Nginx/HAproxy 这一步,没有问题。软件负载到实际业务这里,由于负载均衡(nginx) 是采用转发的方式进行处理的,本地会创建连接,当转发超出 65535 时,(nginx)就不能建立长连接了。Linux 系统调优参数基本已经设置过了,应该不是这_连接数过多导致nginx服务器端口数不足

随便推点

Python语言—爬虫之旅_python与视觉传达-程序员宅基地

文章浏览阅读100次。还有一些标志设计、插图、展示设计、包装设计、书籍设计、广告设计、海报设计、企业形象设计等这些课程,我对于我的艺术水平还是有自知之明的,但我会不断的努力,争取早日突破极限,主要涉及到的软件有photoshop,PublicRelations,ArtificialIntelligence,CINEMA4D等等当然,你还可以涉及到一些达芬奇,AutomotiveEngineering等等范围外的软件。在大数据时代,要熟练运用数据,爬取更多的数据源,不断的磨练,爬虫的基本知识和技术。..._python与视觉传达

基于javaweb的电力设备监测管理系统(servlet+jsp)_java 检测电力设备项目-程序员宅基地

文章浏览阅读96次。基于javaweb的电力设备监测管理系统(servlet+jsp)_java 检测电力设备项目

2023年09月 C/C++(四级)真题解析#中国电子学会#全国青少年软件编程等级考试_2023年9月电子学会真题-程序员宅基地

文章浏览阅读1.1k次。令Santo高兴的是,瓶子中的酒都有不同的味道。接下来的每组数据,第一行是一个整数 N (1 _2023年9月电子学会真题

Git基础语法-程序员宅基地

文章浏览阅读465次。git的基础语法_git基础语法

Java基于注解实现日志记录模块,超详细注释!_java如何使用注解记录日志-程序员宅基地

文章浏览阅读810次,点赞15次,收藏17次。在项目开发过程中,日志记录是一个至关重要的环节,它能够帮助开发人员追踪用户的重要操作,如新增、删除、修改等,从而有效监控系统的运行状态。通过日志记录,我们可以深入了解系统的运行情况,及时发现并解决问题,优化性能,提高用户体验。_java如何使用注解记录日志

Cisco 构建小型局域网络(三层交换机和路由器、ospf 动态路由配置)_思科中小型企业网络拓扑图及配置-程序员宅基地

文章浏览阅读1.2w次,点赞31次,收藏264次。一、实训内容:架构分析(1)需求分析本实验的目的在于建立小型局域网。由于公司由不同部门组成,并分布在不同地点,因此需要划分不同网络实现互联互通。设计以下网络:两个部门各使用一台交换机连接,然后连接到总交换机,再通过路由器与外网以及其他部门网络相连。为了控制网络上的广播风暴,增加网络的安全性,在交换机上需要设置VLAN,在路由器与交换机之间需要设置动态路由OSPF协议。(2)环境要求Cisco模拟器规划拓扑(1)拓扑描述地点1包括部门1和部门2;地点2包括部门3。部门1网络为子网3:172_思科中小型企业网络拓扑图及配置

推荐文章

热门文章

相关标签