Как опубликовать данные изображения из j2me в ASP.net MVC 3? - PullRequest
0 голосов
/ 18 февраля 2012

Я создаю мобильное приложение j2me, которое может публиковать изображения (в виде байта []) и другие простые данные (строки, целые числа, числа с плавающей запятой и т. Д.) На веб-сайте ASP.net MVC 3.В настоящее время приложение и веб-сайт почти готовы, за исключением части, в которой приложение может публиковать данные изображения на веб-сайте.

Вот модель данных, которую я хотел бы опубликовать на веб-сайте (j2me):

public class DataModel {
    private String description = null;
    private float latitude = 0;
    private float longitude = 0;
    private long timestamp = 0;
    private String userName = null;
    private byte[] imageData = null;
    private String contentType = null;

    // getters and setters...
}

Это модель, которую ожидает мой веб-сайт (ASP.net MVC3 C #):

public class Model
{
    public string Description { get; set; }
    public float Latitude { get; set; }
    public float Longitude { get; set; }
    public long Timestamp { get; set; }
    public string UserName { get; set; }
    public byte[] Image { get; set; }
}

Это (упрощенный) код, который я использую для отправки данных (j2me):

InputStream in = null;
OutputStream out = null;

// url contains all the simple data
String encodedUrl = UrlEncoder.encodeUrl(url);
this.connection = (HttpConnection)Connector.open(encodedUrl);
byte[] imageData = DataModel.getImageData();

this.connection.setRequestMethod(HttpConnection.POST);
this.connection.setRequestProperty("Content-Length", imageData.length + "");

out = this.connection.openOutputStream();
out.write(imageData);

int responseCode = this.connection.getResponseCode();

if(responseCode != HttpConnection.HTTP_OK) {
    throw new IOException("Transmission failed as server responded with response code: " + responseCode);
}
// process response here...

Я нашел некоторые решения в Интернете для обработки почтового запроса из приложения j2me, которое не выполняет то, что я хочу, и это в VB.Но, возможно, там есть какой-то полезный код, который должен быть помещен в событие загрузки страницы:

' the stream will be ASCII encoded'
Dim ascii As ASCIIEncoding = New ASCIIEncoding

'Get ASCII into reg. string here'
strmContent = ascii.GetString(strArr)
Label1.Text = strArr.ToString()

'write the received data to a text file'
Dim FILE_NAME As String = "C:\\NP\\received.txt"
Dim objWriter As New System.IO.StreamWriter(FILE_NAME, True)
objWriter.WriteLine(strmContent)
objWriter.WriteLine()
objWriter.Close()

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

Я разделяю простые данные от данных изображения.Это даже правильный способ работы здесь?

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

1 Ответ

1 голос
/ 19 февраля 2012

Я не эксперт j2me, но вы можете просто сделать запрос multipart/form-data, как показано в этой статье , который позволяет отправлять файлы в дополнение к простым значениям в HTTP-запрос. Таким образом, ваш код будет выглядеть примерно так:

byte[] fileBytes = DataModel.getImageData();
Hashtable params = new Hashtable();
params.put("Description", "some description");
params.put("Latitude", "5");
params.put("Longitude", "6");
params.put("Timestamp", "123");
params.put("UserName", "john smith");
HttpMultipartRequest req = new HttpMultipartRequest(
    "http://example.com/home/upload",
    params,
    "Image", "original_filename.png", "image/png", fileBytes
);
byte[] response = req.send();

Тогда на стороне ASP.NET MVC ваша модель представления будет просто выглядеть так:

public class MyViewModel
{
    public string Description { get; set; }
    public float Latitude { get; set; }
    public float Longitude { get; set; }
    public long Timestamp { get; set; }
    public string UserName { get; set; }
    public HttpPostedFileBase Image { get; set; }
}

и действие вашего контроллера:

[HttpPost]
public ActionResult Upload(MyViewModel model)
{
    ...
}

А вот код HttpMultipartRequest (в случае, если сайт Nokia не работает):

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.Hashtable;

import javax.microedition.io.Connector;
import javax.microedition.io.HttpConnection;

public class HttpMultipartRequest
{
    static final String BOUNDARY = "----------V2ymHFg03ehbqgZCaKO6jy";

    byte[] postBytes = null;
    String url = null;

    public HttpMultipartRequest(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());

        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");

        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).append("\r\n")
                .append("--").append(boundary).append("\r\n");
        }
        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();
    }

    public byte[] send() throws Exception
    {
        HttpConnection hc = null;

        InputStream is = null;

        ByteArrayOutputStream bos = new ByteArrayOutputStream();

        byte[] res = null;

        try
        {
            hc = (HttpConnection) Connector.open(url);

            hc.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + getBoundaryString());

            hc.setRequestMethod(HttpConnection.POST);

            OutputStream dout = hc.openOutputStream();

            dout.write(postBytes);

            dout.close();

            int ch;

            is = hc.openInputStream();

            while ((ch = is.read()) != -1)
            {
                bos.write(ch);
            }
            res = bos.toByteArray();
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        finally
        {
            try
            {
                if(bos != null)
                    bos.close();

                if(is != null)
                    is.close();

                if(hc != null)
                    hc.close();
            }
            catch(Exception e2)
            {
                e2.printStackTrace();
            }
        }
        return res;
    }
}
...