在黑莓上传UTF-8文本文件



我正在尝试上传一个UTF-8文本文件到黑莓服务器。上传工作得很好,但当我检查服务器中的文件时,它是一个ASCII文件,我需要的是一个UTF-8文件。

这是我创建文件时使用的代码:

FileConnection fc = (FileConnection)Connector.open(fileName);
if (!fc.exists()){
    fc.create();
}
long byteOffset = fc.usedSize();
OutputStream outStream = fc.openOutputStream(byteOffset);           
outStream.write(line.getBytes("UTF-8"));
outStream.close();
fc.close();

发送文件,我使用以下命令:

public void run (){
    httpConnection = null;
    _connectionURL = null;
    String lineEnd = "rn";
    String twoHyphens = "--"; 
    String boundary = "*****";  
    int rc = -1;
    OutputStream os = null;
    try {
        _connectionURL = Constants.UPLOAD_URL + getConnectionString();
        httpConnection = (HttpConnection)Connector.open(_connectionURL);
        byte [] postDataBytes = getData();
        httpConnection.setRequestMethod("POST");
        httpConnection.setRequestProperty("Connection", "Keep-Alive"); 
        httpConnection.setRequestProperty("User-Agent", "BlackBerry");
        httpConnection.setRequestProperty("Content-Type", "multipart/form-data;boundary=*****");                        
        httpConnection.setRequestProperty(HttpProtocolConstants.HEADER_CONTENT_LANGUAGE, "en-US");
        httpConnection.setRequestProperty(HttpProtocolConstants.HEADER_CACHE_CONTROL,"no-cache, no-store, no-transform");           
        os = httpConnection.openOutputStream();
        os.write((twoHyphens + boundary + lineEnd).getBytes());
        os.write(("Content-Disposition: form-data; name="uploadedfile";filename="" + fileName +""" + lineEnd).getBytes());
        os.write(lineEnd.getBytes());
        os.write(postDataBytes);
        os.write(lineEnd.getBytes());
        os.write((twoHyphens + boundary + twoHyphens + lineEnd).getBytes());
        os.flush(); 

        // Response
        rc = httpConnection.getResponseCode();
        InputStream in = httpConnection.openInputStream();
        int ch;
        StringBuffer stringBuffer = new StringBuffer();
        while( ( ch = in.read() ) != -1 ){
            stringBuffer.append( (char)ch );
        }            
        String responseString = stringBuffer.toString();
        ...
    }catch (IOException ioe){
       ...
    }
}
...
private byte[] getData() throws IOException {
    int _c;
    StringBuffer _stringBuffer = new StringBuffer("UTF-8");
    FileConnection fileForUpload = (FileConnection) Connector.open(Constants.FOLDER_FILES+this.fileName, Connector.READ);
    this.fileInputStream = fileForUpload.openDataInputStream();
    this.postData = new URLEncodedPostData("UTF-8", false);
    while( (_c = this.fileInputStream.read()) != -1){
        _stringBuffer.append((char)_c);         
    }
    postData.setData(_stringBuffer);
    byte [] _postData = postData.getBytes();
    fileForUpload.close();
    return _postData;
}

我猜有一些错误在getData()方法或在httpConnection属性,但我不知道它是什么。

谢谢你的帮助

除了Jon Skeet的回答。

要从文件中读取字节数组,可以简单地使用net.rim.device.api.io.IOUtilities:

FileConnection fileForUpload = 
        (FileConnection) Connector.open(path, Connector.READ);
InputStream stream = fileForUpload.openInputStream();
byte[] data = IOUtilities.streamToBytes(stream);

看看这段代码,它出现了两次:

while( ( ch = in.read() ) != -1 ){
    stringBuffer.append( (char)ch );
}

这是将每个字节视为一个单独的字符,有效地在ISO-8859-1中。

如果您真的想将内容转换为文本,您应该使用编码为UTF-8的InputStreamReader,然后理想地读取字符(而不是一次读取一个字符)。

这也没用:

byte [] _postData = postData.getBytes();

将使用平台默认编码将字符串转换为字节-这几乎不是您想要的。

考虑到你的getData方法正试图读取文件作为字节数组,你不应该将其转换为文本在所有,IMO。如果事先知道文件长度,则应该创建一个大小合适的字节数组,并重复调用InputStream.read(byte[], int, int),注意返回值以查看读取了多少。如果您不这样做,您可以重复地读入一个较小的缓冲区,然后将您刚刚读到的数据写入ByteArrayOutputStream,您稍后可以从中获得字节数组。

此外,您似乎从未关闭任何流-这应该在finally语句中执行,因此即使抛出异常,流也会关闭。

相关内容

  • 没有找到相关文章

最新更新