Blackberry jde: как загрузить изображение на сервер, используя MultipartPostData - PullRequest
0 голосов
/ 17 марта 2011

Вот проблема, я пытаюсь отправить изображение на удаленный сервер, используя класс MultipartPostData.

Я создаю свои PostData со следующим кодом:

PostData body = new MultipartPostData(MultipartPostData.DEFAULT_CHARSET, false);
body.append("deviceID", ""+DeviceInfo.getDeviceId());
body.append("synchro", "true");
body.append("shoot_lat", ""+latitude);
body.append("shoot_long", ""+longitude);
body.append("shoot_place", ""+city);
body.append("shoot_time", String.valueOf(time));
body.append("ref_data", "filename=\"photo.jpg\"");
//image is a byte[]
body.setData(image);

Я думаю, что что-то не так в настройке изображения, потому что сервер не может получить это тело (если я печатаю данные, полученные и проанализированные сервером в теле запроса, я получаю пустую строку).

Кто-нибудь может помочь с созданием рабочего запроса на отправку изображения?

Большое спасибо.

1 Ответ

2 голосов
/ 25 марта 2011

Хорошо, я наконец-то нашел ответ сам.

    private static final String BOUNDARY = "---------------------------14737809831466499882746641449";

public void createHttpMultipartRequest(String url, Hashtable params, String fileField, String fileName, String fileType, byte[] fileBytes) throws Exception
{
    this.url = url;
    String boundary = getBoundaryString();
    String boundaryMessage = getBoundaryMessage(boundary, params, fileField, fileName, fileType);

    String endBoundary = "\r\n--" + boundary + "--\r\n";
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    bos.write(boundaryMessage.getBytes());

    if(fileField != null)
    {
        bos.write(fileBytes);
    }
    bos.write(endBoundary.getBytes());

    this.postBytes = bos.toByteArray();
    bos.close();
}

String getBoundaryString()
{
    return BOUNDARY;
}

String getBoundaryMessage(String boundary, Hashtable params, String fileField, String fileName, String fileType)
{
    StringBuffer res = new StringBuffer("--").append(boundary).append("\r\n");
    String intermediateBoundary = "\r\n--" + boundary + "\r\n";

    Enumeration keys = params.keys();
    while(keys.hasMoreElements())
    {
        String key = (String)keys.nextElement();
        String value = (String)params.get(key);
        res.append("Content-Disposition: form-data; name=\"").append(key).append("\"\r\n")    
            .append("\r\n").append(value);

        if(keys.hasMoreElements())
        {
            res.append(intermediateBoundary);
        }
    }

    if(fileField != null)
    {
        res.append(intermediateBoundary);
        res.append("Content-Disposition: form-data; name=\"").append(fileField).append("\"; filename=\"").append(fileName).append("\"\r\n") 
            .append("Content-Type: ").append(fileType).append("\r\n\r\n");
    }
    return res.toString();
}

В Hashtable содержатся все параметры формы.И файлBytes содержит данные для отправки.

...