如何通过POST请求在Java(Android应用)中将音频文件发送到服务器?

huangapple go评论85阅读模式
英文:

How to send audio file to server via POST request in Java (Android App)?

问题

我想在我的Java Android应用中通过POST请求将音频文件发送到服务器以下是我目前的代码但是它无法正常工作

我找到了这个实现了MultiPart Utility的类

public class MultipartUtility {

    private static final String LINE_FEED = "\r\n";
    private HttpURLConnection httpConn;
    private String charset;
    private OutputStream outputStream;
    private PrintWriter writer;
    private final String boundary;

    // ...(省略部分代码)...

    public List<String> finish() throws IOException {
        List<String> response = new ArrayList<String>();

        writer.append(LINE_FEED).flush();
        writer.append("--" + boundary + "--").append(LINE_FEED);
        writer.close();

        // 首先检查服务器的状态代码
        int status = httpConn.getResponseCode();
        if (status == HttpURLConnection.HTTP_OK) {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    httpConn.getInputStream()));
            String line = null;
            while ((line = reader.readLine()) != null) {
                response.add(line);
            }
            reader.close();
            httpConn.disconnect();
        } else {
            throw new IOException("Server returned non-OK status: " + status);
        }

        return response;
    }
}

想要使用以下客户端代码向服务器发送POST请求

String requestURL = "http://0.0.0.0:5000/test";
try {
    com.eng.elfarsisy.recored.MultipartUtility multipart = new com.eng.elfarsisy.recored.MultipartUtility(requestURL, charset);

    multipart.addHeaderField("User-Agent", "CodeJava");
    multipart.addHeaderField("Test-Header", "Header-Value");

    multipart.addFormField("description", "Cool Pictures");
    multipart.addFormField("keywords", "Java,upload,Spring");

    multipart.addFilePart("fileUpload", uploadFile1);

    List<String> response = multipart.finish();

    System.out.println("SERVER REPLIED:");

    for (String line : response) {
        System.out.println(line);
    }
} catch (IOException ex) {
    System.err.println(ex);
}

但是我得到了以下响应

`I/System.out: (HTTPLog)-Static: isSBSettingEnabled false`
`I/System.out: (HTTPLog)-Static: isSBSettingEnabled false`
`W/System.err: java.net.SocketException: Permission denied`

如何修复这个问题任何想法将不胜感激
英文:

I want to send an audio file to a server via a POST request in my Java Android App. The following code is what I currently have, however, it is not working.

I have found this class implementing a MultiPart Utility:

public class MultipartUtility {
private static final String LINE_FEED = &quot;\r\n&quot;;
private HttpURLConnection httpConn;
private String charset;
private OutputStream outputStream;
private PrintWriter writer;
private final String boundary;
public MultipartUtility(String requestURL, String charset)
throws IOException {
this.charset = charset;
// creates a unique boundary based on time stamp
boundary = &quot;===&quot; + System.currentTimeMillis() + &quot;===&quot;;
URL url = new URL(requestURL);
httpConn = (HttpURLConnection) url.openConnection();
httpConn.setUseCaches(false);
httpConn.setDoOutput(true); // indicates POST method
httpConn.setDoInput(true);
httpConn.setRequestProperty(&quot;Content-Type&quot;,
&quot;multipart/form-data; boundary=&quot; + boundary);
httpConn.setRequestProperty(&quot;User-Agent&quot;, &quot;CodeJava Agent&quot;);
httpConn.setRequestProperty(&quot;Test&quot;, &quot;Bonjour&quot;);
outputStream = httpConn.getOutputStream();
writer = new PrintWriter(new OutputStreamWriter(outputStream, charset),
true);
}
public void addFormField(String name, String value) {
writer.append(&quot;--&quot; + boundary).append(LINE_FEED);
writer.append(&quot;Content-Disposition: form-data; name=\&quot;&quot; + name + &quot;\&quot;&quot;)
.append(LINE_FEED);
writer.append(&quot;Content-Type: text/plain; charset=&quot; + charset).append(
LINE_FEED);
writer.append(LINE_FEED);
writer.append(value).append(LINE_FEED);
writer.flush();
}
public void addFilePart(String fieldName, File uploadFile)
throws IOException {
String fileName = uploadFile.getName();
writer.append(&quot;--&quot; + boundary).append(LINE_FEED);
writer.append(
&quot;Content-Disposition: form-data; name=\&quot;&quot; + fieldName
+ &quot;\&quot;; filename=\&quot;&quot; + fileName + &quot;\&quot;&quot;)
.append(LINE_FEED);
writer.append(
&quot;Content-Type: &quot;
+ URLConnection.guessContentTypeFromName(fileName))
.append(LINE_FEED);
writer.append(&quot;Content-Transfer-Encoding: binary&quot;).append(LINE_FEED);
writer.append(LINE_FEED);
writer.flush();
FileInputStream inputStream = new FileInputStream(uploadFile);
byte[] buffer = new byte[4096];
int bytesRead = -1;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
outputStream.flush();
inputStream.close();
writer.append(LINE_FEED);
writer.flush();
}
public void addHeaderField(String name, String value) {
writer.append(name + &quot;: &quot; + value).append(LINE_FEED);
writer.flush();
}
public List&lt;String&gt; finish() throws IOException {
List&lt;String&gt; response = new ArrayList&lt;String&gt;();
writer.append(LINE_FEED).flush();
writer.append(&quot;--&quot; + boundary + &quot;--&quot;).append(LINE_FEED);
writer.close();
// checks server&#39;s status code first
int status = httpConn.getResponseCode();
if (status == HttpURLConnection.HTTP_OK) {
BufferedReader reader = new BufferedReader(new InputStreamReader(
httpConn.getInputStream()));
String line = null;
while ((line = reader.readLine()) != null) {
response.add(line);
}
reader.close();
httpConn.disconnect();
} else {
throw new IOException(&quot;Server returned non-OK status: &quot; + status);
}
return response;
}
}

and want to send a POST request to a server with this client code:

String requestURL = &quot;http://0.0.0.0:5000/test&quot;;
try {
com.eng.elfarsisy.recored.MultipartUtility multipart = new com.eng.elfarsisy.recored.MultipartUtility(requestURL, charset);
multipart.addHeaderField(&quot;User-Agent&quot;, &quot;CodeJava&quot;);
multipart.addHeaderField(&quot;Test-Header&quot;, &quot;Header-Value&quot;);
multipart.addFormField(&quot;description&quot;, &quot;Cool Pictures&quot;);
multipart.addFormField(&quot;keywords&quot;, &quot;Java,upload,Spring&quot;);
multipart.addFilePart(&quot;fileUpload&quot;, uploadFile1);
List&lt;String&gt; response = multipart.finish();
System.out.println(&quot;SERVER REPLIED:&quot;);
for (String line : response) {
System.out.println(line);
}
} catch (IOException ex) {
System.err.println(ex);
}

However I am getting this response:

I/System.out: (HTTPLog)-Static: isSBSettingEnabled false
I/System.out: (HTTPLog)-Static: isSBSettingEnabled false
W/System.err: java.net.SocketException: Permission denied

How can I fix this? Any ideas would be greatly appreciated.

答案1

得分: 0

你是否已将此权限添加到清单文件中?

<uses-permission android:name="android.permission.INTERNET"/>
英文:

Have you added this permission to your manifest?

&lt;uses-permission android:name=&quot;android.permission.INTERNET&quot;/&gt;

huangapple
  • 本文由 发表于 2020年4月8日 03:20:01
  • 转载请务必保留本文链接:https://go.coder-hub.com/61087785.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定