formfile文件上传使用示例

代码如下:

package TOOLS;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.URL;
import java.util.Map;
import android.util.Log;

/**
 * 上传的文件
 */
public class FormFile {
    private final static String LOGKEY = "FormFile";
    /** 上传文件的数据 */
    private byte[] data;
    private InputStream inStream;
    private File file;
    /** 文件名称 */
    private String filname;
    /** 请求参数名称 */
    private String parameterName;
    /** 内容类型 */
    private String contentType = "application/octet-stream";

/**
     *
     * @param filname
     *            文件名称
     * @param data
     *            上传的文件数据
     * @param parameterName
     *            参数
     * @param contentType
     *            内容类型
     */
    public FormFile(String filname, byte[] data, String parameterName,
            String contentType) {
        this.data = data;
        this.filname = filname;
        this.parameterName = parameterName;
        if (contentType != null)
            this.contentType = contentType;
    }

/**
     *
     * @param filname
     *            文件名
     * @param file
     *            上传的文件
     * @param parameterName
     *            参数
     * @param contentType
     *            内容内容类型
     */
    public FormFile(String filname, File file, String parameterName,
            String contentType) {
        this.filname = filname;
        this.parameterName = parameterName;
        this.file = file;
        try {
            this.inStream = new FileInputStream(file);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        if (contentType != null)
            this.contentType = contentType;
    }

public File getFile() {
        return file;
    }

public InputStream getInStream() {
        return inStream;
    }

public byte[] getData() {
        return data;
    }

public String getFilname() {
        return filname;
    }

public void setFilname(String filname) {
        this.filname = filname;
    }

public String getParameterName() {
        return parameterName;
    }

public void setParameterName(String parameterName) {
        this.parameterName = parameterName;
    }

public String getContentType() {
        return contentType;
    }

public void setContentType(String contentType) {
        this.contentType = contentType;
    }
    private String Opertype=null;
    public void setOper(String Opertype){
        this.Opertype=Opertype;
    }
    public boolean post(String path, Map<String, String> params)
            throws Exception {
        final String BOUNDARY = "--------------7da2137580612"; // 数据分隔线
        final String endline = "--" + BOUNDARY + "--\r\n";// 数据结束标志

int fileDataLength = 0;
        // 得到文件类型数据的总长度
        StringBuilder fileExplain = new StringBuilder();
        fileExplain.append("--");
        fileExplain.append(BOUNDARY);
        fileExplain.append("\r\n");
        fileExplain.append("Content-Disposition: form-data;name=\""
                + getParameterName() + "\";filename=\"" + getFilname()
                + "\"\r\n");
        fileExplain.append("Content-Type: " + getContentType() + "\r\n\r\n");
        fileExplain.append("\r\n");
        fileDataLength += fileExplain.length();
        if (getInStream() != null) {
            fileDataLength += getFile().length();
        } else {
            fileDataLength += getData().length;
        }

StringBuilder textEntity = new StringBuilder();
        for (Map.Entry<String, String> entry : params.entrySet()) {//构造文本类型参数的实体数据
            textEntity.append("--");
            textEntity.append(BOUNDARY);
            textEntity.append("\r\n");
            textEntity.append("Content-Disposition: form-data; name=\""
                    +  entry.getKey() + "\"\r\n\r\n");
            textEntity.append(entry.getValue());
            textEntity.append("\r\n");
        }
        Log.v(LOGKEY, textEntity.toString());
        // 计算传输给服务器的实体数据总长度
        int dataLength = textEntity.toString().getBytes().length
                + fileDataLength + endline.getBytes().length;

URL url = new URL(path);
        Log.v(LOGKEY, url.toString());
        int port = url.getPort() == -1 ? 80 : url.getPort();
        Socket socket = new Socket(InetAddress.getByName(url.getHost()), port);
        OutputStream outStream = socket.getOutputStream();
        // 下面完成HTTP请求头的发送
        String requestmethod = "POST " + url.getPath()+"?"+Opertype + " HTTP/1.1\r\n";
        Log.v(LOGKEY, requestmethod);
        outStream.write(requestmethod.getBytes());
        String accept = "Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*\r\n";
        outStream.write(accept.getBytes());
        String language = "Accept-Language: zh-CN\r\n";
        outStream.write(language.getBytes());
        String contenttype = "Content-Type: multipart/form-data; boundary="
                + BOUNDARY + "\r\n";
        outStream.write(contenttype.getBytes());
        String contentlength = "Content-Length: " + dataLength + "\r\n";
        outStream.write(contentlength.getBytes());
        String alive = "Connection: Keep-Alive\r\n";
        outStream.write(alive.getBytes());
        String host = "Host: " + url.getHost() + ":" + port + "\r\n";
        outStream.write(host.getBytes());
        // 写完HTTP请求头后根据HTTP协议再写一个回车换行
        outStream.write("\r\n".getBytes());
        // 把所有文本类型的实体数据发送出来
        outStream.write(textEntity.toString().getBytes());
        // 把所有文件类型的实体数据发送出来

StringBuilder fileEntity = new StringBuilder();
        fileEntity.append("--");
        fileEntity.append(BOUNDARY);
        fileEntity.append("\r\n");
        fileEntity.append("Content-Disposition: form-data;name=\""
                + getParameterName() + "\";filename=\"" + getFilname()
                + "\"\r\n");
        fileEntity.append("Content-Type: " + getContentType() + "\r\n\r\n");
        outStream.write(fileEntity.toString().getBytes());
        if (getInStream() != null) {
            byte[] buffer = new byte[1024];
            int len = 0;
            while ((len = getInStream().read(buffer, 0, 1024)) != -1) {
                outStream.write(buffer, 0, len);
            }
            getInStream().close();
        } else {
            outStream.write(getData(), 0, getData().length);
        }
        outStream.write("\r\n".getBytes());

// 下面发送数据结束标志,表示数据已经结束
        outStream.write(endline.getBytes());

BufferedReader reader = new  BufferedReader(new InputStreamReader(socket.getInputStream()));
        if (reader.readLine().indexOf("200") == -1) {// 读取web服务器返回的数据,判断请求码是否为200,如果不是200,代表请求失败
            return false;
        }

outStream.flush();
        outStream.close();
        reader.close();
        socket.close();
        return true;
    }
}
//测试代码
File iconFile = new File("file路径");
String url="htttp://192.168.1.101:8080/APP/initServlet";
Map<String, String> map = new HashMap<String, String>();//表单内容
map.put("name","blog");

if (iconFile != null) {
                    FormFile uploadfile = new FormFile(iconFile.getName(),
                            iconFile, "iconfile", "image/jpeg");
                    uploadfile.setOper("action=insertusr");//在url上插入?action=insertusr
                    try {
                        boolean isok = uploadfile.post(url, map);
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }

(0)

相关推荐

  • formfile文件上传使用示例

    复制代码 代码如下: package TOOLS;import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.net.Ine

  • GO语言实现文件上传的示例代码

    目录 前言 文件上传 表单操作 服务端操作 流程实现 小结 前言 最近在写一个文件上传的功能,现在来进行整理总结一下go语言如何上传文件的,本文主要分享一下golang实现文件上传的流程和具体代码,供大家参考,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助. 文件上传 表单操作 要使表单能够上传文件,需要添加form的enctype属性enctype="multipart/form-data",upload.html代码如下: <html> <head> &

  • vue中实现图片和文件上传的示例代码

    html页面 <input type="file" value="" id="file" @change='onUpload'>//注意不能带括号 js代码 methods: { //上传图片 onUpload(e){ var formData = new FormData(); f ormData.append('file', e.target.files[0]); formData.append('type', 'test');

  • Java实现一个简单的文件上传案例示例代码

    Java实现一个简单的文件上传案例 实现流程: 1.客户端从硬盘读取文件数据到程序中 2.客户端输出流,写出文件到服务端 3.服务端输出流,读取文件数据到服务端中 4.输出流,写出文件数据到服务器硬盘中 下面上代码 上传单个文件 服务器端 package FileUpload; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.Serve

  • React+Koa实现文件上传的示例

    背景 最近在写毕设的时候,涉及到了一些文件上传的功能,其中包括了普通文件上传,大文件上传,断点续传等等 服务端依赖 koa(node.js框架) koa-router(Koa路由) koa-body(Koa body 解析中间件,可以用于解析post请求内容) koa-static-cache(Koa 静态资源中间件,用于处理静态资源请求) koa-bodyparser(解析 request.body 的内容) 后端配置跨域 app.use(async (ctx, next) => { ctx.

  • SpringBoot集成FastDFS依赖实现文件上传的示例

    前言 对FastDFS文件系统安装后的使用. FastDFS的安装请参考这篇:Docker中搭建FastDFS文件系统(多图) 本文环境:IDEA + JDK1.8 + Maven 本文项目代码:fastdfs_jb51.rar 1.引入依赖 简单说一下这个依赖部分,目前大部分都是采用的如下依赖: <!-- https://mvnrepository.com/artifact/net.oschina.zcx7878/fastdfs-client-java --> <dependency&

  • SpringBoot整合腾讯云COS对象存储实现文件上传的示例代码

    目录 1.开通腾讯云对象存储服务 2.创建存储桶 3.密钥管理,新建密钥 4.yml配置密钥.COS信息 5.COSConfig配置类 6.COS文件上传工具类 7.Controller测试上传接口: 8.PostMan接口调用 9.浏览器预览效果 企业级项目开发中都会有文件.图片.视频等文件上传并能够访问的场景,对于初学者Demo可能会直接存储在应用服务器上:对于传统项目可能会单独搭建FastDFS.MinIO等文件服务来实现存储,这种方案可能对于企业成本较小,但缺点也是很多,例如:1.增加技

  • Vue+NodeJS实现大文件上传的示例代码

    目录 整体思路 项目演示 前端界面 文件切片 hash计算 查询切片状态 切片上传(断点续传) 文件总体上传进度 合并文件 优化 请求并发数控制 hash值计算优化 常见的文件上传方式可能就是new一个FormData,把文件append进去以后post给后端就可以了.但如果采用这种方式来上传大文件就很容易产生上传超时的问题,而且一旦失败还得从新开始,在漫长的等待过程中用户还不能刷新浏览器,不然前功尽弃.因此这类问题一般都是通过切片上传. 整体思路 将文件切成多个小文件 hash计算,需要计算一

  • Node.js实现文件上传的示例

    文件上传指的是将用户本地的文件上传到服务器中. 上传文件需要处理两个位置: 客户端 客户端如何上传文件? 上传文件的表单项需要指定为input,type是file 要上传文件必须将表单enctype设置为multipart/form-data 这个参数表示表单将会以多部件表单的形式上传enctype="application/x-www-form-urlencoded"是默认值.这个值的意思指将会对表单项的内容进行url编码,所谓url编码就将请求参数转换为二进制编码. 1.multi

  • springMVC实现前台带进度条文件上传的示例代码

    项目框架采用spring+hibernate+springMVC如果上传文件不想使用flash那么你可以采用HTML5;截图前段模块是bootstarp框架;不废话直接来代码;spring-mvc配置文件;效果截图如下: 详细实现如下: 1.mvc-config.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/s

随机推荐