如何将文件从 Android 上传到 node.js 服务器
How to upload file from Android to node.js server
我正在尝试通过 http 从 android 应用程序向 node.js 服务器发送文件。
但是,当我收到文件时,它的大小是 0 字节,
虽然我可以读取文件的原始名称。
你知道这里出了什么问题吗?
这是 android 部分:
public class ImageUploader {
public static final String HTTP_LOCALHOST_8081_FILE_UPLOAD = "http://192.168.1.104:8081/file_upload";
public void upload(InputStream inputStream, String extension) {
AsyncHttpClient asyncHttpClient = new AsyncHttpClient();
RequestParams requestParams = prepareRequestParams(inputStream, extension);
asyncHttpClient.post(HTTP_LOCALHOST_8081_FILE_UPLOAD, requestParams, new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
error.printStackTrace();
}
});
}
private RequestParams prepareRequestParams(InputStream inputStream, String extension) {
RequestParams requestParams = new RequestParams();
requestParams.put("image", inputStream, "image." + extension, "image/jpeg");
return requestParams;
}}
这里是 node.js 部分:
var express = require('express')
var multer = require('multer')
var app = express()
var path = require('path')
var uploading = require('./uploading/uploading.js')
var storage = multer.diskStorage({
destination: function(req, file, cb) {
cb(null, 'uploads/')
},
filename: function(req, file, cb) {
cb(null, file.fieldname + '_' + Date.now() + path.extname(file.originalname))
}
})
var upload = multer({
storage: storage
})
app.use(express.static('public'));
app.post('/file_upload', upload.single('image'), function(req, res) {
//uploading.openIrfanView(__dirname, req.file.filename)
res.sendStatus(200);
})
var server = app.listen(8081, function() {})
我的猜测是 java inputStream
不适合 http multipart
请求,或者我需要使用一些特殊的节点库来读取发送的内容。
好的,伙计们,我明白了。
这不是我第一次偶然发现 - 它是从输入流中读取 清空它。
我从Uri
中获取了inputStream
,然后第一次从中读取显示在设备的屏幕上,然后第二次传递给ImageUploader
那时 inputStream
已经是空的了。
我可能应该将该代码片段粘贴到问题中。
我正在尝试通过 http 从 android 应用程序向 node.js 服务器发送文件。
但是,当我收到文件时,它的大小是 0 字节, 虽然我可以读取文件的原始名称。
你知道这里出了什么问题吗?
这是 android 部分:
public class ImageUploader {
public static final String HTTP_LOCALHOST_8081_FILE_UPLOAD = "http://192.168.1.104:8081/file_upload";
public void upload(InputStream inputStream, String extension) {
AsyncHttpClient asyncHttpClient = new AsyncHttpClient();
RequestParams requestParams = prepareRequestParams(inputStream, extension);
asyncHttpClient.post(HTTP_LOCALHOST_8081_FILE_UPLOAD, requestParams, new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
error.printStackTrace();
}
});
}
private RequestParams prepareRequestParams(InputStream inputStream, String extension) {
RequestParams requestParams = new RequestParams();
requestParams.put("image", inputStream, "image." + extension, "image/jpeg");
return requestParams;
}}
这里是 node.js 部分:
var express = require('express')
var multer = require('multer')
var app = express()
var path = require('path')
var uploading = require('./uploading/uploading.js')
var storage = multer.diskStorage({
destination: function(req, file, cb) {
cb(null, 'uploads/')
},
filename: function(req, file, cb) {
cb(null, file.fieldname + '_' + Date.now() + path.extname(file.originalname))
}
})
var upload = multer({
storage: storage
})
app.use(express.static('public'));
app.post('/file_upload', upload.single('image'), function(req, res) {
//uploading.openIrfanView(__dirname, req.file.filename)
res.sendStatus(200);
})
var server = app.listen(8081, function() {})
我的猜测是 java inputStream
不适合 http multipart
请求,或者我需要使用一些特殊的节点库来读取发送的内容。
好的,伙计们,我明白了。
这不是我第一次偶然发现 - 它是从输入流中读取 清空它。
我从Uri
中获取了inputStream
,然后第一次从中读取显示在设备的屏幕上,然后第二次传递给ImageUploader
那时 inputStream
已经是空的了。
我可能应该将该代码片段粘贴到问题中。