Java 使用POST方法连接HttpURLConnection的Android提供了EOFEException

Java 使用POST方法连接HttpURLConnection的Android提供了EOFEException,java,android,http,file-upload,httpurlconnection,Java,Android,Http,File Upload,Httpurlconnection,我得到了这个奇怪的场景,每当我使用POST和上传文件的请求体发出请求时,我的头部分将不包含任何内容,除了contentType,每当我尝试读取响应时,它会给我带来EOFEException,下面是我的代码。任何帮助都将不胜感激 public static Response executeFWUploadRequest(Context context, String fileName, String version,

我得到了这个奇怪的场景,每当我使用POST和上传文件的请求体发出请求时,我的头部分将不包含任何内容,除了contentType,每当我尝试读取响应时,它会给我带来EOFEException,下面是我的代码。任何帮助都将不胜感激

    public static Response executeFWUploadRequest(Context context, String fileName, String version,
                                              String checksum, File payload, int retry) {


    if (CommonUtils.isConnectedToWiFi(context)) {
        HttpURLConnection urlConnection = null;
        String boundary = "+++++";
        String LINE_FEED = "\n";
        try {
            URL url = new URL(CommonUtils.UPLOAD_URL);

            CommonUtils.writeLog("HTTP Client REQUEST URL = " + url);

            urlConnection = (HttpURLConnection) url.openConnection();

            urlConnection.setRequestMethod(METHOD_POST);
            urlConnection.setDoInput(true);
            urlConnection.setDoOutput(true);
            urlConnection.setRequestProperty(Tag.CONTENT_TYPE_TAG, "multipart/form-data; boundary=" + boundary);
            urlConnection.setRequestProperty("Connection", "close");
            urlConnection.setConnectTimeout(TimeOut);
            urlConnection.setReadTimeout(TimeOut);

            OutputStream outputStream = urlConnection.getOutputStream();

            BufferedOutputStream dos = new BufferedOutputStream(outputStream);
            dos.flush();
            String partition = "--" + boundary;
            dos.write(LINE_FEED.getBytes());

            dos.write(partition.getBytes());
            dos.write(LINE_FEED.getBytes());
            String disp3 = "Content-Disposition: form-data; name=\"" + Tag.FILE_LENGTH_FIELD + "\"" + LINE_FEED + LINE_FEED + "value = \"" + payload.length() + "\"";
            dos.write(disp3.getBytes());
            dos.write(LINE_FEED.getBytes());

            dos.write(partition.getBytes());
            dos.write(LINE_FEED.getBytes());
            String dis1 = "Content-Disposition: form-data; name=\"" + Tag.VERSION_TAG + "\"" + LINE_FEED + LINE_FEED + "value = \"" + version + "\"";
            dos.write(dis1.getBytes());
            dos.write(LINE_FEED.getBytes());

            dos.write(partition.getBytes());
            dos.write(LINE_FEED.getBytes());
            String disp2 = "Content-Disposition: form-data; name=\"" + Tag.CHECKSUM_TAG + "\"" + LINE_FEED + LINE_FEED + "value = \"" + checksum + "\"";
            dos.write(disp2.getBytes());
            dos.write(LINE_FEED.getBytes());

            dos.write(partition.getBytes());
            dos.write(LINE_FEED.getBytes());
            String disp4 = "Content-Disposition: form-data; name=\"file \"; " + Tag.FILE_NAME_TAG + "=\"" + payload.getName() + "\"";
            dos.write(disp4.getBytes());
            dos.write(LINE_FEED.getBytes());
            String disp5 = Tag.CONTENT_TYPE_TAG + ": " + Tag.STREAM_CONTENT_TYPE_VALUE;
            dos.write(disp5.getBytes());
            dos.write(LINE_FEED.getBytes());
            dos.write(LINE_FEED.getBytes());

            FileInputStream inputStream = new FileInputStream(payload);
            byte[] buffer = new byte[4096];
            int bytesRead = -1;
            while ((bytesRead = inputStream.read(buffer)) != -1) {
                dos.write(buffer, 0, bytesRead);
            }

            dos.write(LINE_FEED.getBytes());
            dos.write((partition + "--").getBytes());
            dos.flush();
            dos.close();
            //tried with and with out below 2 lines
            outputStream.close();
            urlConnection.connect();
            //This line gives error its method to read response with its patch
            return readData(urlConnection,0);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (urlConnection != null) {
                urlConnection.disconnect();
            }
        }
    } else {
        CommonUtils.writeLog("HTTP Client : Wifi connection is not available");
    }
    return null;
}




private static final int MAX_RETRY = 5;
private static Response readData(HttpURLConnection urlConnection, int retry) {
    Response objResponse = null;
    try {
        objResponse = new Response();
        String content;
        if (retry < MAX_RETRY) {
            objResponse.setResponseCode(urlConnection.getResponseCode());

            if (objResponse.getResponseCode() == 200) {
                content = convertInputStreamToString(new BufferedInputStream(urlConnection
                        .getInputStream()));
                objResponse.setResponseContent(content);
            } else {
                content = convertInputStreamToString(new BufferedInputStream(urlConnection
                        .getErrorStream()));
                objResponse.setResponseContent(content);
            }
        }
    } catch (EOFException eof) {
        eof.printStackTrace();
        readData(urlConnection, retry + 1);
    } catch (IOException e) {
        e.printStackTrace();
    }
    return objResponse;
}
public static Response executeFWUploadRequest(上下文上下文、字符串文件名、字符串版本、,
字符串校验和、文件负载、整数重试){
if(CommonUtils.isConnectedToWiFi(上下文)){
HttpURLConnection-urlConnection=null;
字符串边界=“+++”;
字符串行_FEED=“\n”;
试一试{
URL=新URL(CommonUtils.UPLOAD\u URL);
writeLog(“HTTP客户端请求URL=“+URL”);
urlConnection=(HttpURLConnection)url.openConnection();
urlConnection.setRequestMethod(METHOD_POST);
urlConnection.setDoInput(true);
urlConnection.setDoOutput(true);
urlConnection.setRequestProperty(Tag.CONTENT\u TYPE\u标记,“多部分/表单数据;边界=“+boundary”);
setRequestProperty(“连接”、“关闭”);
设置连接超时(超时);
urlConnection.setReadTimeout(超时);
OutputStream OutputStream=urlConnection.getOutputStream();
BufferedOutputStream dos=新的BufferedOutputStream(outputStream);
dos.flush();
字符串分区=“--”+边界;
write(LINE_FEED.getBytes());
write(partition.getBytes());
write(LINE_FEED.getBytes());
String disp3=“内容处理:表单数据;名称=\”“+Tag.FILE\u LENGTH\u FIELD+”\”“+LINE\u FEED+LINE\u FEED+”值=\”“+payload.LENGTH()+“\”;
write(disp3.getBytes());
write(LINE_FEED.getBytes());
write(partition.getBytes());
write(LINE_FEED.getBytes());
String dis1=“内容配置:表单数据;名称=\”“+Tag.VERSION\u Tag+”\”“+LINE\u FEED+LINE\u FEED+”值=\”“+VERSION+”;
write(dis1.getBytes());
write(LINE_FEED.getBytes());
write(partition.getBytes());
write(LINE_FEED.getBytes());
String disp2=“内容处理:表单数据;名称=\”“+Tag.CHECKSUM\u Tag+”\”“+LINE\u FEED+LINE\u FEED+“值=\”“+CHECKSUM+”\”;
write(disp2.getBytes());
write(LINE_FEED.getBytes());
write(partition.getBytes());
write(LINE_FEED.getBytes());
String disp4=“内容处置:表单数据;名称=\”文件\“;“+Tag.file\u name\u Tag+”=\”“+payload.getName()+”\”;
write(disp4.getBytes());
write(LINE_FEED.getBytes());
String disp5=Tag.CONTENT\u TYPE\u Tag+”:“+Tag.STREAM\u CONTENT\u TYPE\u VALUE;
write(disp5.getBytes());
write(LINE_FEED.getBytes());
write(LINE_FEED.getBytes());
FileInputStream inputStream=新的FileInputStream(有效负载);
字节[]缓冲区=新字节[4096];
int字节读取=-1;
而((bytesRead=inputStream.read(缓冲区))!=-1){
写(缓冲区,0,字节读);
}
write(LINE_FEED.getBytes());
写((分区+“-”).getBytes();
dos.flush();
dos.close();
//尝试使用和不使用以下2行
outputStream.close();
urlConnection.connect();
//这一行给出了错误的方法来读取带有补丁的响应
返回readData(urlConnection,0);
}捕获(例外e){
e、 printStackTrace();
}最后{
if(urlConnection!=null){
urlConnection.disconnect();
}
}
}否则{
CommonUtils.writeLog(“HTTP客户端:Wifi连接不可用”);
}
返回null;
}
私有静态最终int MAX_RETRY=5;
私有静态响应读取数据(HttpURLConnection-urlConnection,int-retry){
响应objResponse=null;
试一试{
objResponse=新响应();
字符串内容;
如果(重试<最大重试){
objResponse.setResponseCode(urlConnection.getResponseCode());
if(objResponse.getResponseCode()==200){
内容=convertInputStreamToString(新的BufferedInputStream(urlConnection
.getInputStream());
objResponse.setResponseContent(内容);
}否则{
内容=convertInputStreamToString(新的BufferedInputStream(urlConnection
.getErrorStream());
objResponse.setResponseContent(内容);
}
}
}捕获(EOFEException eof){
eof.printStackTrace();
readData(urlConnection,重试+1);
}捕获(IOE异常){
e、 printStackTrace();
}
返回objResponse;
}

这里,响应的返回类型是存储响应代码和响应内容的自定义POJO类。

有多个
String disp*=“content Disposition:form data;
headerswell它只是一个用于主体部分的变量名,因为BOS只允许写入由disp*.getBytes()编写的字节从我的研发相关问题来看,我可以说请求正文中允许多个内容处置。对不起,我的意思是HTTP请求中有多个
内容处置
头。另请参阅。让我尝试一下头,我从与单个“内容处置”链接中了解到的头“有多个
String disp*=”内容配置:表单数据;
headerswell它只是一个用于身体部位的变量名,因为BOS只允许写入