Ich versuche, eine Datei von Android auf einen WCF-Dienst hochzuladen. Ich bin an den Punkt gekommen, wo die Methode auf der WCF ausgelöst wird und die Datei speichert. Beim Versuch, die Datei zu öffnen, erhalte ich eine Fehlermeldung, die besagt, dass sie beschädigt ist.C# & Java - Hochladen einer Datei von Android auf WCF
Ich denke, der Fehler könnte in der HttpFileUpload-Klasse sein, dass eine der statischen Variablen falsch ist oder dass was ich sende ist kein Stream, sondern etwas anderes, dass der Dienst in einen Stream irgendwie die Korruption umgewandelt .
Der verwendete Code kann unten gefunden werden.
Android Code:
HttpFileUpload Klasse:
Der HttpFileUpload Code gefunden here:
private static final String LINE_FEED = "\r\n";
private String charset = "UTF-8";
public HttpFileUpload(String requestURL) throws IOException {
// creates a unique boundary based on time stamp
boundary = "===" + System.currentTimeMillis() + "===";
URL url = new URL(requestURL);
httpConn = (HttpURLConnection) url.openConnection();
httpConn.setUseCaches(false);
httpConn.setDoOutput(true); // indicates POST method
httpConn.setDoInput(true);
httpConn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
httpConn.setRequestProperty("Host", "x.x.x.x:x");
outputStream = httpConn.getOutputStream();
writer = new PrintWriter(new OutputStreamWriter(outputStream, charset), true);
}
public void addFilePart(String fieldName, File uploadFile) throws IOException {
String fileName = uploadFile.getName();
writer.append("--" + boundary).append(LINE_FEED);
writer.append("Content-Disposition: form-data; name=\"" + fieldName + "\"; filename=\"" + fileName + "\"").append(LINE_FEED); // form-data
writer.append("Content-Type: " + URLConnection.guessContentTypeFromName(fileName)).append(LINE_FEED);
writer.append("Content-Transfer-Encoding: binary").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 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 status: " + status);
}
return response;
}
Service Connector Klasse
String urlTo = LOCATION + "/UploadUserProfilePicture";
File file = new File(imagePath);
try {
HttpFileUpload httpFileUpload = new HttpFileUpload(urlTo);
httpFileUpload.addFilePart("image", file);
List<String> responses = httpFileUpload.finish();
for (String line : responses) {
System.out.println(line);
}
return responses.get(0);
} catch (Exception ex) {
return ex.toString();
}
WCF-Servicecode
IMobileService:
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
[OperationContract]
Result UploadUserProfilePicture(Stream image);
MobileService:
Die FileType fileType = bytes.GetFileType()
ist ein Plugin, das die Erweiterung zurückgibt. Derzeit funktioniert das Plugin nicht, da der Dateityp immer null ist. Die Bildvariable ist jedoch möglicherweise bereits beschädigt.