Java 在Android中使用ion库将文件(多部分/表单数据)上载到服务器失败
我是android新手,正在尝试使用ion library将文件上传到服务器 但是文件崩溃了。有了这个错误Java 在Android中使用ion库将文件(多部分/表单数据)上载到服务器失败,java,c#,android,ion,Java,C#,Android,Ion,我是android新手,正在尝试使用ion library将文件上传到服务器 但是文件崩溃了。有了这个错误 FATAL EXCEPTION: Thread-55725 Process: transitions.com.example.huzy_kamz.interview, PID: 4635
FATAL EXCEPTION: Thread-55725
Process: transitions.com.example.huzy_kamz.interview, PID: 4635
java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
at android.os.Handler.<init>(Handler.java:209)
at android.os.Handler.<init>(Handler.java:123)
at android.app.Dialog.<init>(Dialog.java:122)
at android.app.AlertDialog.<init>(AlertDialog.java:200)
at android.app.AlertDialog.<init>(AlertDialog.java:196)
at android.app.AlertDialog.<init>(AlertDialog.java:141)
at android.app.ProgressDialog.<init>(ProgressDialog.java:77)
at transitions.com.example.huzy_kamz.interview.MainActivity.uploadFile(MainActivity.java:131)
at transitions.com.example.huzy_kamz.interview.MainActivity$2$1.run(MainActivity.java:66)
at java.lang.Thread.run(Thread.java:818)
从调用链中删除线程,因为Ion为您管理该线程,并且您的异常与Ion FYI无关
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(selectedFilePath != null){
dialog = ProgressDialog.show(MainActivity.this,"","Uploading File...",true);
uploadFile(selectedFilePath);
// OnSendFileInfo();
}else{
Toast.makeText(MainActivity.this,"Please choose a File First",Toast.LENGTH_SHORT).show();
}
}
});
您不能在非Ui线程中使用视图。正如我看到的,您正在上传方法中创建一个进度对话框,该对话框被线程调用。该代码应该只在主线程中 我发现了一种简单的方法,可以通过上传进度条上传或发布多部分/表单数据。也许这会有帮助 假设您的服务器正在等待以下数据: 1.文件PDF、图像、音频、视频等 2.姓名 3.电子邮件 4.地址 如果你想在一个URL中上传一次信息,无论是绝对URL还是相对URL,ion library在这方面都很简单、精确、高效,而且更好 步骤1: 声明您的URI 步骤2: 然后从你的图库中选择文件,这里是你的选择。你可以确定你想要用户查看的任何类型的文件,我在这里我已经确定了一个PDF文件。 在这一行intent.setTypeapplication/pdf 然后,您可以在按钮中调用showFileChooser,单击以访问您的多媒体资料 步骤3: 创建包含离子库的上载方法以启动作业。如果你在这个方法中看到,我首先声明了文件,名称,电子邮件,地址,对于文件,它获取了所选文件或路径文件的URI数据,然后名称,电子邮件,地址,它从EditText获取数据,你必须声明EditText来获取数据 b然后确定你想在发布我的信息时使用的URL是URL。但是,请确保在加载部分包含POST。loadPOST,url。 然后使用.setMultipartFileFile、file设置文件,并通过设置MultipartParameter.setMultipartParameterName、name等设置其余参数
public void Upload() {
String file= FilePath.getPath(this, filePath);
final String name = name_edt.getText().toString();
final String email = email_edt.getText().toString();
final String address = address_edt.getText().toString();
final ProgressDialog pd;
pd = new ProgressDialog(MainActivity.this);
pd.setMessage("Logging in...");
pd.setCancelable(false);
pd.show();
final String url_ = "xxxxxxxxxxxxxxx";
final File file = new File(Uri.parse(path).toString());
Ion.with(MainActivity.this)
.load("POST",url_)
.progressDialog(pd)
.setMultipartFile("file", file)
.setMultipartParameter("Name", name)
.setMultipartParameter("Email", email)
.setMultipartParameter("Address.", address)
.asString()
.setCallback(new FutureCallback<String>() {
@Override
public void onCompleted(Exception e, String result) {
// Toast.makeText(getApplicationContext(),""+file,Toast.LENGTH_LONG).show();
System.out.println("Error " + e);
// Toast.makeText(getApplicationContext(), "Exception : " + e, Toast.LENGTH_LONG).show();
Toast.makeText(getApplicationContext(), result, Toast.LENGTH_LONG).show();
// Toast.makeText(getApplicationContext(),""+e,Toast.LENGTH_LONG).show();
pd.dismiss();
}
});
}
然后你就可以走了,根据你的C API,该文件将能够保存在文件夹中。即使其他人使用Php或任何其他语言,您也可以创建自己的Api将文件保存在服务器文件夹中
希望它能正常工作。检查您选择的文件路径是否存在。i、 e如果文件存在或不存在。如果文件不存在,Ion将抛出异常。您尝试在后台线程中显示对话框;从线程调用的上载文件。看看AsyncTask:是的,我在TextView@ADM中检查了它,它显示了路径,但可能是我在离子代码中的某个地方出错了,请帮我检查一下,这有点棘手thanks@0xDEADC0DE,是的,它确实显示了一个对话框,几分钟后它崩溃并导致错误。@ADM,看起来你知道离子结构,请帮我实现这一点谢谢你的回答,它不再崩溃,但我敬酒,现在它显示为空,是因为我的离子结构,它似乎看不到文件路径,它在文本视图中可见为什么你必须从中检查。为什么在多部分参数中使用application/zip。上载图像文件时。首先阅读文档我应该使用什么,假设我想选择一个pdf文件,请帮助我了解@admrefere的内容类型。
public void FileSave(HttpPostedFile file)
{
try
{
if (file.ContentLength > 0)
{
var fileName = Path.GetFileName(file.FileName);
var path = Path.Combine(Server.MapPath("~/FileStorage"), fileName);
file.SaveAs(path);
}
Response.Write("Upload successfull");
}
catch
{
Response.Write("An Error Ocurred");
}
}
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(selectedFilePath != null){
dialog = ProgressDialog.show(MainActivity.this,"","Uploading File...",true);
uploadFile(selectedFilePath);
// OnSendFileInfo();
}else{
Toast.makeText(MainActivity.this,"Please choose a File First",Toast.LENGTH_SHORT).show();
}
}
});
private Uri filePath;
private void showFileChooser() {
Intent intent = new Intent();
intent.setType("application/pdf");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select Pdf"), PICK_PDF_REQUEST);
}
//handling the image chooser activity result
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == PICK_PDF_REQUEST && resultCode == RESULT_OK && data != null && data.getData() != null) {
filePath = data.getData();
Toast.makeText(getApplicationContext(), "" + filePath, Toast.LENGTH_LONG).show();
}
}
public void Upload() {
String file= FilePath.getPath(this, filePath);
final String name = name_edt.getText().toString();
final String email = email_edt.getText().toString();
final String address = address_edt.getText().toString();
final ProgressDialog pd;
pd = new ProgressDialog(MainActivity.this);
pd.setMessage("Logging in...");
pd.setCancelable(false);
pd.show();
final String url_ = "xxxxxxxxxxxxxxx";
final File file = new File(Uri.parse(path).toString());
Ion.with(MainActivity.this)
.load("POST",url_)
.progressDialog(pd)
.setMultipartFile("file", file)
.setMultipartParameter("Name", name)
.setMultipartParameter("Email", email)
.setMultipartParameter("Address.", address)
.asString()
.setCallback(new FutureCallback<String>() {
@Override
public void onCompleted(Exception e, String result) {
// Toast.makeText(getApplicationContext(),""+file,Toast.LENGTH_LONG).show();
System.out.println("Error " + e);
// Toast.makeText(getApplicationContext(), "Exception : " + e, Toast.LENGTH_LONG).show();
Toast.makeText(getApplicationContext(), result, Toast.LENGTH_LONG).show();
// Toast.makeText(getApplicationContext(),""+e,Toast.LENGTH_LONG).show();
pd.dismiss();
}
});
}