2012-02-18 68 views
0

我正在制作一个j2me移动应用程序,它可以在ASP.net MVC 3网站上发布图像(如byte [])和其他简单数据(字符串,整数,浮点等)。目前应用程序和网站几乎已完成,除了应用程序可以在网站上发布图像数据的部分。如何将图像数据从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... 

我发现了一些sollutions在线处理一个来自一个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() 

我不知道我怎么能接受我的网站上的图像数据。我需要将哪些代码放入Controller Action才能够接收所有数据?我需要更改我的应用程序代码中的任何内容吗?

我从图像数据中分离出简单的数据。这是否正确的工作方式?

非常感谢!

回答

1

我不是j2me的专家,但你可以简单地做一个multipart/form-data请求,如this article所示,它允许你发送除了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代码(如果诺基亚的站点关闭):

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; 
    } 
} 
+0

我目前正面临其他问题阻止我运行我的J2ME应用程序,所以我无法测试您的溶剂。就像我得到那份工作一样,我会让你知道你的溶剂是否有效。 – 2012-02-25 09:43:19