- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图将图像上传到服务器,但不知何故代码停在了 FileInputStream 行。不知道为什么,我不知道如何调试或检查它。这是我的源代码:
public class CreateSetcardStep1Activity extends AppCompatActivity {
@Override
protected void onCreate(final Bundle savedInstanceState) {
String filename = appHelper.dateToString(new Date(), "yyyyMMdd-hhmmss");
destination = new File(Environment.getExternalStorageDirectory(), filename + ".jpg");
buttonTakePhoto.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(destination));
startActivityForResult(intent, REQUEST_IMAGE);
}
});
buttonSubmitPhoto.setVisibility(View.GONE);
buttonSubmitPhoto.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
dialog = ProgressDialog.show(CreateSetcardStep1Activity.this, "", "Uploading file...", true);
new Thread(new Runnable() {
public void run() {
uploadFile(imagePath);
}
}).start();
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_IMAGE && resultCode == Activity.RESULT_OK) {
try {
buttonSubmitPhoto.setVisibility(View.VISIBLE);
Log.e(LOG, "breakpoint 1");
setcardPic.setVisibility(View.VISIBLE); Log.e(LOG, "breakpoint 2 destination: "+destination);
FileInputStream in = new FileInputStream(destination); Log.e(LOG, "breakpoint 3");
BitmapFactory.Options options = new BitmapFactory.Options(); Log.e(LOG, "breakpoint 4");
options.inSampleSize = 10; Log.e(LOG, "breakpoint 5");
imagePath = destination.getAbsolutePath(); Log.e(LOG, "breakpoint 6 imagePath: "+imagePath);
Log.e(LOG, "PATH === " + imagePath);
//tvPath.setText(imagePath);
Bitmap bmp = BitmapFactory.decodeStream(in, null, options);
setcardPic.setImageBitmap(bmp);
showUploadButton = true;
} catch (FileNotFoundException e) {
e.printStackTrace();
}
} else {
showUploadButton = false;
Toast.makeText(getApplicationContext(),
R.string.request_cancelled,
Toast.LENGTH_LONG).show();
}
}
public int uploadFile(String sourceFileUri) {
String fileName = sourceFileUri;
showUploadButton = false; //revert upload button to hidden
HttpURLConnection conn = null;
DataOutputStream dos = null;
String lineEnd = "\r\n";
String twoHyphens = "--";
String boundary = "*****";
int bytesRead, bytesAvailable, bufferSize;
byte[] buffer;
int maxBufferSize = 1024 * 1024;
File sourceFile = new File(sourceFileUri);
if (!sourceFile.isFile()) {
dialog.dismiss();
Log.e(LOG, "Source File not exist :" +imagePath);
return 0;
}
else
{
try {
// open a URL connection to the Servlet
FileInputStream fileInputStream = new FileInputStream(sourceFile);
URL url = new URL(upLoadServerUri);
// Open a HTTP connection to the URL
conn = (HttpURLConnection) url.openConnection();
conn.setDoInput(true); // Allow Inputs
conn.setDoOutput(true); // Allow Outputs
conn.setUseCaches(false); // Don't use a Cached Copy
conn.setRequestMethod("POST");
conn.setRequestProperty("Connection", "Keep-Alive");
conn.setRequestProperty("ENCTYPE", "multipart/form-data");
conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
conn.setRequestProperty("Filedata", fileName);
dos = new DataOutputStream(conn.getOutputStream());
dos.writeBytes(twoHyphens + boundary + lineEnd);
dos.writeBytes("Content-Disposition: form-data; name=\"uploaded_file\";filename="+ fileName + "" + lineEnd);
dos.writeBytes(lineEnd);
// create a buffer of maximum size
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
buffer = new byte[bufferSize];
// read file and write it into form...
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
while (bytesRead > 0) {
dos.write(buffer, 0, bufferSize);
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
}
// send multipart form data necesssary after file data...
dos.writeBytes(lineEnd);
dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
// Responses from the server (code and message)
serverResponseCode = conn.getResponseCode();
String serverResponseMessage = conn.getResponseMessage();
Log.i(LOG, "HTTP Response is : "+ serverResponseMessage + ": " + serverResponseCode);
if(serverResponseCode == 200){
runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(CreateSetcardStep1Activity.this, "File Upload Complete.",
Toast.LENGTH_SHORT).show();
}
});
}
//close the streams //
fileInputStream.close();
dos.flush();
dos.close();
} catch (MalformedURLException ex) {
dialog.dismiss();
ex.printStackTrace();
runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(CreateSetcardStep1Activity.this, "MalformedURLException",
Toast.LENGTH_SHORT).show();
}
});
Log.e(LOG, "error: " + ex.getMessage(), ex);
} catch (Exception e) {
dialog.dismiss();
e.printStackTrace();
runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(CreateSetcardStep1Activity.this, "Got Exception : see logcat ",
Toast.LENGTH_SHORT).show();
}
});
Log.e(LOG, "Exception : "
+ e.getMessage(), e);
}
dialog.dismiss();
return serverResponseCode;
}
}
}
有什么方法可以检查问题出在哪里? logcat 在断点 2 处停止: breakpoint 2 destination:/storage/emulated/0/20171215-051851.jpg所以如果我检查资源管理器,文件就在那里
最佳答案
发生这种情况是因为您没有请求 EXTERNAL_STORAGE 权限。
从 android API 级别 23 (marshmallow) 开始,android 权限框架(我不知道这是否是正确的术语)已经改变。
在使用 marshmallow 之前,您只需在 list 文件中声明权限即可。但是在 marshmallow 之上,android 权限被归类为 Normal permissions和 Dangerous permissions .如果您使用的是普通权限,那么所有 android 版本都是一样的。但是如果您使用的是危险权限,则必须请求用户在运行时授予该权限。
在您的情况下,您正在上传一张图片,这需要 READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE 权限。这些被归类为危险权限。因此,您必须在执行任何需要这些权限的操作之前请求这些权限。
但是您不必分别请求这两个权限,因为这些权限属于一个 permission group .
来自官方文档,
If an app requests a dangerous permission listed in its manifest, and the app already has another dangerous permission in the same permission group, the system immediately grants the permission without any interaction with the user..
即,如果您已经声明了对单个权限组的几个权限,则您只需请求其中一个权限。如果用户授予该权限组的权限,则系统将授予您声明的所有在同一权限组中的权限。
这是请求存储权限的代码
private static final int STORAGE_REQ_ID=3465;
if (ContextCompat.checkSelfPermission(CreateSetcardStep1Activity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)
{
if (ActivityCompat.shouldShowRequestPermissionRationale(CreateSetcardStep1Activity.this,
Manifest.permission.READ_EXTERNAL_STORAGE)) {
//THIS CONDITION WORKS WHEN WE ARE REQUSETING PERMISSION AGAIN SINCE USER DENIED PERMISSION ON PREVIOUS REQUEST(S)
ActivityCompat.requestPermissions(CreateSetcardStep1Activity.this,
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
STORAGE_REQ_ID);
} else {
//REQUESTING PERMISSION FOR FIRST TIME, EXPLAIN WHY THE APPLICATION NEED PERMISSION
AlertDialog.Builder builder = new AlertDialog.Builder(CreateSetcardStep1Activity.this);
builder.setTitle("Permission Request");
builder.setMessage("To upload image, Application need External storage permission");
builder.setPositiveButton("Grant", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
ActivityCompat.requestPermissions(CreateSetcardStep1Activity.this,
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
STORAGE_REQ_ID);
}
});
builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
}
});
AlertDialog dialog = builder.create();
dialog.show();
ActivityCompat.requestPermissions(CreateSetcardStep1Activity.this,
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
STORAGE_REQ_ID);
}
}
else startImageCapture();
}
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
//HERE YOU HANDLE PERMISSION REQUEST RESULTS
switch (requestCode) {
case STORAGE_REQ_ID: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//PERMISSION GRANTED!!
startImageCapture();
} else {
//USER DENIED PERMISSION, NOTIFY THE USER THAT PERMISSION IS DENIED, MAY BE A TOAST?
}
return;
}
}
}
private void startImageCapture(){
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(destination));
startActivityForResult(intent, REQUEST_IMAGE);
}
其他的都差不多。 (抱歉我的英语不好)
有关权限请求的更多信息 here
关于android - 上传图片到服务器 : stuck at FileInputStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47829362/
Weblogic 10.3.6 管理控制台有两个与卡住线程时间配置相关的参数。 其中一个:Servers -> Some_Server -> Configuration -> Tuning 具有参数:
我正在使用 lift-json 将 JSON 字符串反序列化为 Scala 案例类。我正在解析的 JSON 有一个共同的结构:数据、成功和错误字段,其中数据包含有趣的位。我已经创建了一个 APIRes
我偶尔会做一名 VBA 程序员,只是为了好玩(不是我的工作)。 我在 MS Excel 2010 中有一系列 VBA 模块。无法弄清楚我做错了什么。这个例程奏效了,然后我改变了一些东西,它就不再起作用
给定以下 C 代码: struct list_element { struct list_element * next; }; typedef struct list_element list
我正在尝试创建一个类似乒乓球的游戏,并且我已经开始实现一些有关 Racket 运动的代码。桨本身的运动一切正常。然而,当我突然改变桨的方向时(更具体地说,当我立即从向上移动桨切换到向下移动桨时,反之亦
我是第一次在网站上手工编码(主要是打印设计师)。我试图只使用 HTML 和 CSS,因为我没有时间深入研究任何 Javascript,而且我真的很想了解我在使用什么。因此,我的主要内容设置在图像网格中
我正在制作一款类似 rogue 的游戏,我正在使用网格内的随机游走来形成“洞穴”系统。然而,我提出的随机游走会卡住——尤其是当游走者靠近网格边缘并且被“洞”包围时。 这不是我在我的项目中使用的确切代码
我在将我的分支推送到远程存储库时遇到问题。 Git 返回一个错误:错误:dst refspec refs/heads/XXX 匹配多个。 当我运行 git ls-remote 时,它只显示一个 XXX
我在终止集群中的命名空间时遇到问题,它在命名空间 JSON 中显示了许多参数。我点击了这个链接 https://medium.com/@craignewtondev/how-to-fix-kubern
首先,我为非描述性标题道歉。因为我不知道实际发生了什么,所以我不能让它更具体。 现在我的问题。我已经为 99 Haskell problems 的问题 23 实现了以下片段,应该随机选择n列表中的项目
尝试解决 eqb_trans 我陷入困境: Theorem eqb_trans : forall n m p, n =? m = true -> m =? p = true -> n =?
我曾经想在Grails中记录sql查询,所以我在数据源中添加了 logSql = true 并在log4j中 trace 'org.hibernate.type' debug 'org.hiberna
我在一个相互碰撞的世界中有几个球。世界各地都有静墙。 有时,它们最终会处于沿同一路径向上/向下或向左/向右移动的位置(垂直于墙壁的运动?) 有什么简单的方法可以检测到这一点,然后在任一方向上对其进行一
我有两个 MySQL 服务器,它们在同一组复制上运行。设置已通过以下步骤完成: 第一台服务器是有大量数据的生产服务器。 我将它设置为只读并转储数据,然后在后备 MySQL 服务器上恢复它 恢复后,我执
编辑:我意识到我的OP中的代码又长又难读。我用 4 行代码突出显示了这个问题。 char **t = {"Hello", "World"}; char **a = t; ++(a[0]); print
我试图将图像上传到服务器,但不知何故代码停在了 FileInputStream 行。不知道为什么,我不知道如何调试或检查它。这是我的源代码: public class CreateSetcardSt
规范:Ubuntu 13.04、Python 3.3.1 一般背景:Python 初学者; 特定问题的背景:我已经精疲力竭地试图解决这个问题,而且我知道,除了它对学习 Python 的指导值(valu
我创建了这个递归脚本,用于检查您所在的地址,然后检查另一个文件层次结构(如果您所在的文件夹也存在于该位置)。例如,假设您在 somerandomsite.com/example/folder/fold
我制作了视频来向您展示确切的问题(向上)。我有一个卡片动画。第一个动画是当您加载页面时,这些卡片会自动飞入。 .card{ animation: startup .5s ease-in-out .2s
简介: 我研究了 blocking TCP server 的 MSDN 示例和 blocking TCP client . 鉴于修改这些示例以创建简单的聊天应用程序,我想尝试一些简单的事情。 首先,我
我是一名优秀的程序员,十分优秀!