在我的Android应用程序中,我需要将Assets / Drawable / raw文件夹中的图像上传到服务器。 我尝试了以下方法:
InputStream fileInputStream;
if(imageChanged) {
File file = New File("filename");
fileInputStream = new FileInputStream(file);
}else {
fileInputStream = ctx.getAssets().open("default.png");
}
int bytesAvailable;
byte[] buffer = new byte[102400];
while((bytesAvailable = fileInputStream.available()) > 0) {
int bufferSize = Math.min(bytesAvailable, 102400);
if(bufferSize<102400){
buffer = new byte[bufferSize];
}
int bytesRead = fileInputStream.read(buffer, 0,bufferSize);
dos.write(buffer, 0, bytesRead);
}
执行得很好。我能够读取输入流并将字节写入DataOutputStream,将图像上传到服务器。
无论如何,服务器上的图像似乎已损坏 - 仅适用于默认图像(在“其他”块中上传。“if”块图像未损坏)
我也尝试将default.png放在'raw'文件夹中并尝试下面的
fileInputStream = ctx.getResources().openRawResource(R.drawable.default);
此处的结果相同 - 服务器上的图像已损坏。
我开始怀疑这是否是因为default.png在应用程序空间中。
我是否可以获得一些帮助,以便在应用程序领域(drawable / asset / raw)上传图像?
谢谢!
NIMI
答案 0 :(得分:0)
它可能与缓冲区大小有关?我尝试了两种不同的方法从assets文件夹读取/写入png,两者都生成了一个工作图像。我使用FileOutputStream写入sdcard但这应该不是问题。
InputStream is, is2;
FileOutputStream out = null, out2 = null;
try {
//method 1: compressing a Bitmap
is = v.getContext().getAssets().open("yes.png");
Bitmap bmp = BitmapFactory.decodeStream(is);
String filename = Environment.getExternalStorageDirectory().toString()+File.separator+"yes.png";
Log.d("BITMAP", filename);
out = new FileOutputStream(filename);
bmp.compress(Bitmap.CompressFormat.PNG, 90, out);
//method 2: Plain stream IO
String filename2 = Environment.getExternalStorageDirectory().toString()+File.separator+"yes2.png";
out2 = new FileOutputStream(filename2);
Log.d("BITMAP", filename2);
int r, i=0;
is2 = v.getContext().getAssets().open("yes.png");
while ((r = is2.read()) != -1) {
Log.d ("OUT - byte " + i, "Value: " + r);
out2.write(r);
i++;
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (out != null)
out.close();
if (out2 != null)
out2.close();
} catch (IOException e) {
e.printStackTrace();
}
}