当前位置: 首页 > 知识库问答 >
问题:

Multipart HttpUrlConnection数据未接收

王长卿
2023-03-14

我想知道过去2天在这里和那里。我的问题是,我正在使用多部分/表单数据发送多个文件,其中包含一些文本/纯字段。问题是,当我使用HTTPC发送数据时,它工作正常,但是当我尝试使用HTTPURL连接发送数据时,服务器没有收到任何东西,下面是我的多部分实用程序

public class MultipartUtils extends NetworkUtility
{
    private static final String END_REQUEST = "--";
    private String mBoundary;
    
    public MultipartUtils()
    {
        mBoundary = END_REQUEST + "quAxBSd"; 
    }
    public HttpURLConnection getUrlConnection(String URL, String httpMethod,
        String contenttype, String boundry) throws Exception 
{
    URL url = new URL(URL);
    
    HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
    if (httpMethod.equalsIgnoreCase(HTTP_GET) == false)
        urlConnection.setDoInput(true);
    else
        urlConnection.setDoInput(false);
    
    urlConnection.setDoOutput(true);
    urlConnection.setUseCaches(false);
    urlConnection.setRequestMethod(httpMethod);
    
    if (contenttype.equalsIgnoreCase(APPLICATION_MULTIPART))
    {
        urlConnection.setRequestProperty("Connection", "Keep-Alive");
        urlConnection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundry);
        urlConnection.setRequestProperty("ENCTYPE", "multipart/form-data");
    }
    else
    {
        urlConnection.setRequestProperty("Content-Type", contenttype);
    }
    return urlConnection;
}

    public String uploadImagesAddPost(Activity mContext, String URL, String jsonString, ArrayList<ImageListBean> mImageBeanList) throws Exception
    {
        HttpURLConnection httpURLConnection = getUrlConnection(URL, HTTP_POST, APPLICATION_MULTIPART, mBoundary);
        httpURLConnection.connect();
        DataOutputStream dataOutputStream = new DataOutputStream(httpURLConnection.getOutputStream());
        PrintWriter writer = new PrintWriter(new OutputStreamWriter(dataOutputStream, UTF8),
                true);
        
        addJsonToPart(writer, jsonString);
        
        for (int i = 0; i < mImageBeanList.size(); i++)
        {
            try
            {
                byte[] imageByteArray = {};
                Uri imageUri = mImageBeanList.get(i).getmUri();
                String imagePath = ImageCaputureUtility.getPath(imageUri, mContext);
                if (!imagePath.equals(""))
                {
                    if (mImageBeanList.get(i).getmType().equalsIgnoreCase(MellTooConstants.IMG))
                    {
                        //For img
                        Bitmap bitmap = BitmapFactory.decodeFile(imagePath);
                        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
                        bitmap.compress(CompressFormat.JPEG, 100, outputStream);
                        
                        imageByteArray = outputStream.toByteArray();
                        addFileAsByte(dataOutputStream, "imageview" + (i + 1), imageByteArray, ("imageview" + (i + 1)) + ".jpeg", IMAGE_JPEG);
                    }
                    else
                    {
                        //For video
                        /* Uploading thumb*/
                        Bitmap bitmap = UtilsMellToo.createThumb(imageUri, mContext);
                        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
                        bitmap.compress(CompressFormat.JPEG, 100, outputStream);
                        imageByteArray = outputStream.toByteArray();
                        addFileAsByte(dataOutputStream, "imageview4", imageByteArray, "imageview4" + ".jpeg", IMAGE_JPEG);
    
                        /* Uploading video*/
                        imageByteArray = MellTooUtil.readFileToByteArray(new File(imagePath));
                        addFileAsByte(dataOutputStream, "video", imageByteArray, "video" + (i + 1) + ".mp4", VIDEO_MP4);
                    }
                }
                else
                {
                    //No need to upload data
                }
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
    
            if (i + 1 != mImageBeanList.size())
                writer.append(mBoundary).append(CHANGE_LINE);
        }
        writer.append(mBoundary + END_REQUEST);
        writer.flush();
        return getResponse(httpURLConnection);
    }

    private void addJsonToPart(PrintWriter writer, String text)
    {
        writer.append(mBoundary).append(CHANGE_LINE);
        writer.append(CONTENT_DISPOSITION + FORM_DATA + NAME + "\"formstring\"").append(CHANGE_LINE);
        writer.append(CONTENT_TYPE + PLAIN_TEXT + CHARSET + UTF8).append(CHANGE_LINE);
        writer.append(CONTENT_TRANSFER_ENCODING + "8bit").append(CHANGE_LINE);
        writer.append(text).append(CHANGE_LINE);
        writer.flush();     
    }

    public void addFileAsByte(DataOutputStream outputStream, String fieldName, byte[] imageByteArray, String fileName, String contentType) throws IOException
    {
        PrintWriter writer = new PrintWriter(new OutputStreamWriter(outputStream, UTF8),
                true);
        
        writer.append(mBoundary).append(CHANGE_LINE);
        writer.append(CONTENT_DISPOSITION + FORM_DATA + NAME + "\"" + fieldName + "\";" + FILE_NAME + "\"" + fileName + "\"").append(CHANGE_LINE);
        writer.append(CONTENT_TYPE + contentType).append(CHANGE_LINE);
        writer.append(CONTENT_TRANSFER_ENCODING + BINARY).append(CHANGE_LINE);

        writer.flush();
        
        InputStream inputStream = new ByteArrayInputStream(imageByteArray);
        byte[] buffer = new byte[4096];
        int bytesRead = -1;
        while ((bytesRead = inputStream.read(buffer)) != -1) {
            outputStream.write(buffer, 0, bytesRead);
        }
        outputStream.writeBytes(CHANGE_LINE);
        
        outputStream.flush();
        inputStream.close();
        
    }
}

下面是方法,我是如何使用这个类的,

jsonResponseString = new MultipartUtils()
                                        .uploadImagesAddPost(mContext, AppConstants.BASE_URL + AppConstants.SAVE_POST_URL,
                                                mJsonString, mImageList);
        

下面是我ASP的一面,

HttpContextWrapper.Request.Form["formstring"]; //This is returning null

请帮我解决这个问题…!!!提前感谢。

共有1个答案

牛迪
2023-03-14

经过大约4天的挣扎,我发现问题出在边界和请求中的新行……!

文本和图像部分之间应该有一个边界和一个空行,我没有使用它。空行将标题与多部分/表单数据请求的每个部分的 boday 分隔开...!

 类似资料:
  • 我正在尝试spring websockets,由于某些原因我不明白,我可以建立与服务器的连接,但当我发送数据时什么也没有发生。 下面是我的配置类(与其他spring websocket示例完全相同): } 我的控制器,在一个包中,我确保spring inicialites它,因为我用@PostConstruct注释说明init()消息。如您所见,我编写了system.out.println以便在控

  • 所有这些似乎都运行良好,但cliend在身份验证后发送的数据似乎没有收到,只有3个字节设置为0。 我希望套接字在程序的生存期内保持打开状态,因此我不能处理流,因为这样也会处理套接字。 这里是客户端和服务器端的完整代码,希望有人能看到我的错误,或者我错过了一个问题。

  • 我是拉威尔的新手,目前正在拉威尔的一个项目中工作。 当我在我的文件中使用'php工匠服务'来检查它是否工作/localhost,我得到了这个错误: (1/1)HttpException数据库连接失败! 在应用中。php第1014行 应用时- 在ScriptMint中中止时('399','数据库连接失败!')。php第31行 在ScriptMint- 在管道上- at XSP保护- 在管道上- 在T

  • 我有两个数据帧df1(Employee表) 和 在我连接了df1.dept_id和df2.id上的这两个表之后: 同时将其保存在文件中, 它给出错误: 我读过有关使用字符串序列来避免列重复的信息,但这适用于要对其执行连接的列。我需要对未连接的列具有类似的功能。 有没有一种直接的方法可以将重复列嵌入表名以便保存? 我想出了一个解决方案,匹配两个df的列,并重命名重复的列,将表名附加到列名上。但是有直

  • 使用eventmachine gem,我试图在本地主机上发送和接收数据。以下是我的客户端和服务器文件的代码。 服务器铷 客户铷 我在单独的控制台中执行服务器和客户端文件。以下是客户端的输出 客户端输出 服务器输出 在服务器文件中,我已经打印了收到的数据,但它显示“.................. 谢啦

  • 因此,我正在用Java编写一个程序,在DatagramSocket和DataGramPacket的帮助下发送和接收数据。问题是,当我发送数据/接收数据时,数据在我发送的程序中也会有所不同,但只是在某些情况下,比如: 但有时会起作用,比如: