首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安卓okhttp3:预期为2030字节,但收到2362字节

安卓okhttp3:预期为2030字节,但收到2362字节
EN

Stack Overflow用户
提问于 2017-08-09 23:34:33
回答 1查看 1.6K关注 0票数 1

我正在使用okhttp3将视频从安卓手机发送到Java servlet。当我发送多个文件时,会发送前几个文件,但在某些情况下,我开始收到以下异常:

代码语言:javascript
复制
java.net.ProtocolException: expected 2030 bytes but received 2362
at okhttp3.internal.http.Http1xStream$FixedLengthSink.write(Http1xStream.java:283)

我发送视频文件的android代码是:

代码语言:javascript
复制
import android.util.Log;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Set;

import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

public class DataTransfer {
    public static void sendFile(final String method, final String path, final String fileSubType, final HashMap<String, String> hm ) {
        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                OkHttpClient client = new OkHttpClient();

                MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM);
                builder.addFormDataPart("file", path, RequestBody.create(MediaType.parse(fileSubType), new File(path)));

                Set<String> set = hm.keySet();
                for (String s : set) {
                    builder.addFormDataPart(s,hm.get(s));
                }

                RequestBody request_body = builder.build();

                try {
                    Log.e(Constants.TAG, "++++++++++++++++++++++\n\n\nSIZE = " + request_body.contentLength() + "\n\n\n====================================\n");
                } catch (Exception e) {
                    e.printStackTrace();
                }
                Request request = new Request.Builder()
                        .url(Constants.URL + "/" + method)
                        .post(request_body)
                        .build();

                try {
                    Response response = client.newCall(request).execute();
                    Log.d(Constants.TAG, "+++++++++++++++++++++\n" + response.body().toString() + "===========================================");
                    if(!response.isSuccessful()){
                        throw new IOException("Error : "+response);
                    }
                } catch (IOException e) {
                    Log.d(Constants.TAG, Log.getStackTraceString(e));
                }
            }
        });

        t.start();
    }
}

接收文件的Java servlet代码:

代码语言:javascript
复制
@RequestMapping(value="/dataTransfer", method = RequestMethod.POST)
    protected void dataTransfer(HttpServletRequest request, HttpServletResponse response) throws Exception {        
        try {
            List<FileItem> items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
            List<File> files = new ArrayList<File>();//Holds all the files that were received
            HashMap<String, String> map = new HashMap<String, String>();
            for (FileItem item : items) {
                if (item.isFormField()) {
                    // Process regular form field (input type="text|radio|checkbox|etc", select, etc).
                    String fieldName = item.getFieldName();
                    String fieldValue = item.getString();

                    map.put(fieldName, fieldValue);
                } else {
                    // Process form file field (input type="file").
                    String fileName = FilenameUtils.getName(item.getName());//If the name was not specified set default

                    String filePath = Constants.ORIGINAL_DIRECTORY_PATH + fileName;
                    File storeFile = new File(filePath);
                    item.write(storeFile);

                    files.add(storeFile);
                }
            }

            //Do other stuff to file
        } catch (FileUploadException e) {
            throw new ServletException("Cannot parse multipart request.", e);
        }
    }

在服务器端,我得到了这个错误消息:

代码语言:javascript
复制
org.apache.commons.fileupload.MultipartStream$MalformedStreamException: Stream ended unexpectedly

为什么会发生这种情况?我怎么才能修复它?

我发现这不是服务器的问题,而是android的问题,因为如果我注释掉servlet中的所有内容,同样的问题也会发生。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-09 23:43:40

通常,这类错误的发生是因为线程在缓冲区刷新之前退出。

你可以通过放入一个finally块来消除这个问题,这个块优雅地关闭了流/文件,看起来你在服务器中缺少了一个。

参见this answer..

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45595017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档